Assembly 用汇编语言绘制直线

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

我用汇编语言写了一个程序,可以画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
    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