Assembly 用汇编语言绘制直线
我用汇编语言写了一个程序,可以画8条水平线。但我有个问题。我的第五行没有显示。每条线的长度应为320,高度应为25。在CX中,我有行的结尾,在BX中,我有行的开头。每条线都应该是红色的。但是第五行是黑色的 绘制线条的代码如下所示:Assembly 用汇编语言绘制直线,assembly,x86,dos,x86-16,Assembly,X86,Dos,X86 16,我用汇编语言写了一个程序,可以画8条水平线。但我有个问题。我的第五行没有显示。每条线的长度应为320,高度应为25。在CX中,我有行的结尾,在BX中,我有行的开头。每条线都应该是红色的。但是第五行是黑色的 绘制线条的代码如下所示: Draw PROC MOV ax, 0a000h MOV ES, AX MOV BX, CX ADD CX, 8000 etDraw: MOV al, 4 MOV ES:[BX], AL INC BX C
Draw PROC
MOV ax, 0a000h
MOV ES, AX
MOV BX, CX
ADD CX, 8000
etDraw:
MOV al, 4
MOV ES:[BX], AL
INC BX
CMP BX, CX
JL etDraw
RET
ENDP
使用程序:
MOV AX, 0f00h
INT 10h
MOV ax, 0013H
int 10h
MOV ah, 0Ch
CALL Draw
CALL Draw
CALL Draw
CALL Draw
CALL Draw
CALL Draw
CALL Draw
CALL Draw
MOV ah, 08h
int 21h
mov ax, 0f00h
int 10h
mov ax, 0003h
int 10h
mov ax, 4c00h
int 21h
问题是,当您在
Draw
中比较地址以查看是否已到达行尾时,您使用的是JL
(“跳转较少”),这是一种有符号比较。您应该使用无符号比较(JB
,“跳转到下面”)或检查是否与JE
或JZ
相等
这只发生在您的第五行,因为这是结束地址从正数滚动到负数(当它被视为有符号数时)。具体来说,
4 * 8000 = 32000
5 * 8000 = 40000, but with 16 bit signed numbers this will be -25536.
在第五行中,BX从32000开始,CX从-25536开始,因此您将设置一个像素,并且JL
不会跳转(因为32001>-25536)
请记住,无论何时比较地址,它们几乎都应该是无符号比较(
JB
,JA
).您应该在调用此过程的地方显示代码。@Michael刚才没有看到您添加的代码中有任何对Draw
的调用。为什么在调用Draw
之前不给cx
赋值,由于Draw
似乎依赖于此?而且由于您实际上只是用一种颜色填充整个屏幕,您可以用类似于mov ax,0a000h
mov es,ax
xor di,di
mov ecx,16000
mov eax,04040404h
cld
rep stosd