我用汇编语言写了一个程序,打算画8条水平线。但我有一个问题。我的第五条线没有显示。每条线的长度应该是320,高度是25。在CX中,我有线的末端,而在BX中,我有线的开始。每条线都应该是红色的。但是第5条线是黑色的。
绘制这些线条的代码是这样的。
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
.
这只发生在第5行,因为那是结束地址从正数转为负数的地方(当它被认为是一个有符号的数字时)。 具体来说,就是
4 * 8000 = 32000
5 * 8000 = 40000, but with 16 bit signed numbers this will be -25536.
第5行,BX开始为32000,CX开始为-25536,所以你会得到一个像素组和 JL
不会跳转(因为32001 > -25536)。
请记住,无论何时比较地址,几乎都应该是无符号比较(JB
, JA
).