在装配问题中添加和减去

Adding and Subtracting in Assembly issue

以下是我尝试编译和执行的示例代码,以便我可以更好地理解汇编中的算术。我遇到的这个问题是为什么我得到的值是 -32641 而不是 -36?谢谢你。 已编辑

TITLE  Addition and Subtraction        (AddSub3.asm)

; Chapter 4 example. Demonstration of ADD, SUB,
; INC, DEC, and NEG instructions, and how
; they affect the CPU status flags.
; Last update: 2/1/02

INCLUDE Irvine32.inc

.data
Rval SDWORD ?
Xval SDWORD 26
Yval SDWORD 30
Zval SDWORD 40

.code
main PROC

    ; INC and DEC
    mov ax,1000h
    inc ax      ; 1001h
    dec ax      ; 1000h

    ; Expression: Rval = -Xval + (Yval - Zval)
    mov  eax,Xval
    neg  eax        ; -26
    mov  ebx,Yval
    sub  ebx,Zval       ; -10
    add  eax,ebx
    mov  Rval,eax       ; -36

    ; Zero flag example:
    mov cx,1
    sub cx,1        ; ZF = 1
    mov ax,0FFFFh
    inc ax      ; ZF = 1

    ; Sign flag example:
    mov cx,0
    sub cx,1        ; SF = 1
    mov ax,7FFFh
    add ax,2        ; SF = 1

    ; Carry flag example:
    mov al,0FFh
    add al,1        ; CF = 1,  AL = 00

    ; Overflow flag example:
    mov  al,+127
    add  al,1       ; OF = 1
    mov  al,-128
    sub  al,1       ; OF = 1

    call writeint
    exit
main ENDP
END main

Irvine32 writedec 的第一个 google 命中告诉您它需要一个无符号的 arg,而 WriteInt 需要一个有符号的 32 位参数。


由于这些函数打印完整的 32 位 eax 寄存器,这意味着您需要将您的数字符号扩展到完整的 eax 中。

您打印的值为 0xffff807f(十六进制)。那就是 4294934655 - 2^32 = -32641 解释为有符号整数(2 的补码,google 它)。

Irvine32 函数在 eax、IIRC 中获取第一个 arg。

你运行几条修改AX的指令,然后修改AL,在eax中有一个小的负整数之后,所以高16位是0xffff。我没有仔细研究你后面的指令对 eax 的低 2 字节和 1 字节所做的操作,但它看起来不太正常。

我假设您没有意识到 AX 和 AL 是 EAX 的子集,或者编写它们只会让 EAX 的其余部分保持不变。

请参阅 for more info about it. Also the 标签 wiki 以获取有助于纠正其他基本误解的链接,以免它们给您带来问题。 :)