在装配问题中添加和减去
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 的其余部分保持不变。
请参阅 irvine32 for more info about it. Also the x86 标签 wiki 以获取有助于纠正其他基本误解的链接,以免它们给您带来问题。 :)
以下是我尝试编译和执行的示例代码,以便我可以更好地理解汇编中的算术。我遇到的这个问题是为什么我得到的值是 -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 的其余部分保持不变。
请参阅 irvine32 for more info about it. Also the x86 标签 wiki 以获取有助于纠正其他基本误解的链接,以免它们给您带来问题。 :)