Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 装配问题中的加减法_Assembly_X86_Masm_Irvine32 - Fatal编程技术网

Assembly 装配问题中的加减法

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

下面是我试图编译和执行的示例代码,以便更好地理解汇编中的算术。我遇到的这个问题是为什么我得到的值是-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

第一个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?非常感谢。