用汇编语言画线
Drawing lines in assembly language
我用汇编语言写了程序,想画8条横线。但我有一个问题。我的第 5 行没有显示。每行的长度应为 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
("Jump Less"),这是一个有符号比较。您应该使用无符号比较 (JB
、"Jump Below") 或检查 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
)。
我用汇编语言写了程序,想画8条横线。但我有一个问题。我的第 5 行没有显示。每行的长度应为 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
("Jump Less"),这是一个有符号比较。您应该使用无符号比较 (JB
、"Jump Below") 或检查 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
)。