我怎么能在装配中做这样的事情? DOS 16位图形模式
int start_x=1, start_y=1;
for(int i=0; i<8; i++){
for(int j=0; j<8; j++){
if(T34[i][j]==1) put_colour_pixel(start_x+i, start_y+j);
else put_black_pixel(start_x+i, start_y+j);
}
}
:编辑:
所以我的循环很有效。如何使用0和1将其连接到表。
mov ax, 10 ; Y start line
mov bx, 20 ; X start line
mov dl, 4 ; colour (red)
mov cx, 5 ; loop top counter
top:
add ax, 1
push cx ;loop top counter
mov cx, 10
inside:
add bx, 1
push ax
push bx
push cx
call putpixel
pop cx
pop bx
pop ax
loop inside
mov bx, 20 ;next line X go to start X
pop cx ;loop top counter
loop top
/////////////////////////////////////////////// ////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////// 我的新代码:
segment .data
segment .code
..start:
mov ax, 13h
int 10h ; switch to 320x200 mode
mov ax, 0a000h ; The offset to video memory
mov es, ax ; We load it to ES through AX,
; because immediate operation
; is not allowed on ES
;;;;;;;;;;;;;;;;;;;;;;
mov di, T34
mov si, 8
;------------------------------------
P1: mov bp, 8
;----------------
P2: cmp BYTE[di], 1
jnz short NOHIT
NOHIT: ; increase the x position
push ax
push bx
push cx
mov ax,si ;Y
mov bx,bp ;X
mov dl, 1 ; here I should take '0' or '1' from table
call putpixel
pop cx
pop bx
pop ax
inc di ; increase offset address of array
dec bp
jnz P2
;-------------
; increase the y position + substract 8 from x position
dec si
jnz P1
;------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;
xor ah, ah
int 16h ; keyboard (wait for key)
mov ax, 3
int 10h ; go to text mode
mov ax, 4c00h
int 21h ; return to DOS, exit code 0
;;;;;;;;;;;;;;;;;;;;;
putpixel:
push dx ; mul changes dx too
mov cx, 320
mul cx ; multiply Y (ax) by 320 (one row)
add ax, bx ; and add X (bx) (result= dx:ax)
mov di, ax
pop dx
mov [es:di], dl ; store color/pixel
ret
;;;;;;;;;;;;;;;;;;;;;;
T34 DB 1,1,1,1,1,1,1,1
DB 1,0,0,0,0,0,0,0
DB 1,0,0,0,0,0,0,0
DB 1,0,0,0,0,0,0,0
DB 1,1,1,1,1,1,1,1
DB 1,0,0,0,0,0,0,0
DB 1,0,0,0,0,0,0,0
DB 1,1,1,1,1,1,1,1
我已经改变了顺序,现在它正在左角绘制正方形(正如我所料)。我改变了订单吗? 我想这封信会被调整,但这对我来说不是问题。我可以稍后解决。
现在我应该在表格中输入'0'或'1'并设置颜色。哪个寄存器有“0”或“1”?
所以大多数情况下我都有颜色问题。 我试过这个,但我有错误。我尝试设置颜色黑色(0)或蓝色(1)
push dx
mov ax, bp ; X*8
mov cx,8
mul cx
add ax, si ; X*8 +Y
add ax, di ; tab0 + X*8+Y
mov dl, ax; here is error, here I set the colour
pop dx
所以我不知道如何解决它:(我尝试了不同的可能性和北方工作。
答案 0 :(得分:0)
mov di, T34
mov si, 8
;------------------------------------
P1: mov bp, 8
;----------------
P2: cmp BYTE[di], 1
jnz short NOHIT
; save used REGISTER
; load register with the X,Y position and color
call putpixel
; get back the saved Register
NOHIT: ; increase the x position
inc di ; increase offset address of array
dec bp ; decrease counter and set zeroflag if register is zero
jnz P2 ; jump if zeroflag is not set
;-------------
; increase the y position + substract 8 from x position
dec si
jnz P1
;------------------------------------
也可以用0来启动循环的计数器以增加计数器,但是如果我们想要从0到8运行循环,那么我们需要一个比较指令来离开循环。偏移地址数组内部是独立的,与计数器无关。
稍微修改(在代码和第二次调用中添加一个额外的跳转指令)如果数组的字节为0,也可以设置黑色像素。但我认为嵌套循环的这种简单形式是第一次更容易理解。
编辑:现在它与NASM兼容。
Edit2:如果正在使用许多参数,可能更简单的是将x,y坐标存储到已知的ram位置以便在循环内部进行修改和重新加载。
我们的公司位置:
Color DB ? ; define byte
X_Pos DW ? ; define word
Y_Pos DW ?
显示如何访问内存位置的示例(默认段为DS):
mov [X_Pos], ax
mov [X_Pos], bx
mov [Color], dl
mov ax, [X_Pos]
mov bx, [Y_Pos]
mov dl, [Color]
mov WORD[X_Pos], 10
inc WORD[X_Pos]
sub WORD[X_Pos], 8
mov BYTE[Color], 4
inc BYTE[Color]
EDIT3:
mov dl, ax; here is error, here I set the colour
无法将8位寄存器与16位寄存器混用。 注意:
AX = AL+AH
DX = DL+DH
现有说明如下:
mov dl, al
mov dl, ah
mov dx, ax
movzx dl, ax