用汇编语言画线

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") 或检查 JEJZ.

是否相等

这只发生在您的第 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)。

请记住,每当您比较地址时,这些几乎总是无符号比较(JBJA)。