Assembly 装配问题中的加减法
下面是我试图编译和执行的示例代码,以便更好地理解汇编中的算术。我遇到的这个问题是为什么我得到的值是-32641而不是-36?非常感谢。 已编辑Assembly 装配问题中的加减法,assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,下面是我试图编译和执行的示例代码,以便更好地理解汇编中的算术。我遇到的这个问题是为什么我得到的值是-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
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
第一个google点击的
Irvine32 writedec
告诉你它需要一个无符号的参数,WriteInt
需要一个有符号的32位参数
由于这些函数打印完整的32位eax寄存器,这意味着您需要将数字符号扩展到完整的eax中 打印的值为0xffff807f(十六进制)。这就是解释为有符号整数(2的补码,googleit)的
4294934655-2^32=-32641
Irvine32函数在eax、IIRC中获取它们的第一个参数
在eax中有一个小的负整数后,运行几个指令修改AX,然后修改AL,因此上面的16位是0xffff。我没有详细介绍您后面的指令对eax的低2字节和1字节所做的操作,但它看起来不太正常
我假设您没有意识到AX和AL是EAX的子集,或者编写它们只会使EAX的其余部分保持不变。
有关详细信息,请参阅。此外,标记wiki中的链接也有助于在其他基本误解给您带来问题之前纠正它们。:) 您正在将结果打印为无符号值,并且希望有符号。32位进程的堆栈通常位于内存顶部
0xffff807f
可能是堆栈地址。@Lorehead:这是我的第一个想法,但是4294934655-2^32=-32641
,所以这显然不是唯一的问题。请阅读您正在使用的Irvine32库的文档:。选择正确的write…
函数。@PeterCordes:这是一个更好的链接。这…对我来说是很新的。谢谢。我必须继续阅读更多关于它的内容,因为我对汇编相当陌生。我评论中链接处的书籍文档和irvine32标记中的文档更好,因为它实际上告诉了您参数是什么。@MichaelPetch:这是一个很好的观点。我的主要观点是指出使用谷歌来解决(一些)你的问题是多么重要、有用和有效,并不是说谷歌的第一次点击实际上是最有用的参考。是的,但你指出维基标签是一个重要的观点,但你排除了明显的irvine32标签。您的回答表明,WriteDec参数位于EAX中。如果你使用我们自己的irvine32维基标签上的信息,你不需要猜测,因为标签提供的链接要完整得多,可以消除猜测工作。很抱歉,我仍然很困惑。为什么该值仍然等于-32641而不是-36?非常感谢。