用汇编语言画线

问题描述 投票:0回答:1

我用汇编语言写了一个程序,打算画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
assembly x86 dos x86-16
1个回答
2
投票

问题是,当你比较地址在 Draw 看看你是否已经到了终点,你用 JL ("跳得少"),这是一个。签署 比较。你应该使用无符号比较 (JB,"跳到下面")或检查是否与 "跳到下面 "相等。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)。

请记住,无论何时比较地址,几乎都应该是无符号比较(JB, JA).

© www.soinside.com 2019 - 2024. All rights reserved.