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
Assembly 为什么EAX的内容不同?_Assembly_X86_Masm - Fatal编程技术网

Assembly 为什么EAX的内容不同?

Assembly 为什么EAX的内容不同?,assembly,x86,masm,Assembly,X86,Masm,我有两种组装方法: DWToHex PROTO:DWORD修改作为输入参数传递的类型为DWORD的二进制整数 内部EAX转换为十六进制表示形式,指针在单个参数内传递。它是用于调试目的的函数,工作正常 ProcA-PROTO:DWORD-除了破坏EAX的内容之外,什么都不做下面是代码: (很抱歉格式化-这里的常规代码格式化似乎不起作用) )######################################################################### )#####

我有两种组装方法:

  • DWToHex PROTO:DWORD
    修改作为输入参数传递的类型为
    DWORD
    的二进制整数 内部
    EAX
    转换为十六进制表示形式,指针在单个参数内传递。它是用于调试目的的函数,工作正常
  • ProcA-PROTO:DWORD
    -除了破坏
    EAX
    的内容之外,什么都不做下面是代码: (很抱歉格式化-这里的常规代码格式化似乎不起作用)
  • )#########################################################################

    )#########################################################################

    )#########################################################################

    这是调试跟踪:

    .data
    
    MsgBoxCaption4 db  "before calling", 0
    MsgBoxCaption5 db  "after   calling", 0
    
    .data?
    
    N       DWORD   ?
    NTXT        db 16 dup(?)
    
    .code
    
    mov eax, N
    invoke  cx_DWToHex, addr NTXT
    invoke  MessageBox, NULL, addr NTXT, addr MsgBoxCaption4, MB_OK ; show eax as hexadecimal
    
    mov eax, N                      ;   ***** point A ****
    invoke  ProcA, addr sdt         ;   ***** point B ****
    ;   mov eax, N
    invoke  cx_DWToHex, addr NTXT
    invoke  MessageBox, NULL, addr NTXT, addr MsgBoxCaption5, MB_OK ; show eax as hexadecimal
    

    问题:
    为什么B点A点中的
    EAX
    内容不同

    用于调用
    ProcA
    invoke
    指令应该获取“sdt”的地址,并将其推送到堆栈上。更可能的是,它生成的代码与

    lea eax, sdt
    push eax
    call ProcA
    

    这会破坏
    eax
    的内容。您可以通过查看生成代码的反汇编来验证这一点。

    您可以询问ProcA在不发布代码的情况下对eax做了什么。看起来它改变了eax。如果在点a上设置断点,那么实际上可以看到MessageBox的返回值。@HansPassant procA代码在粗体后面的(2)下方text@HansPassat,addrSTD不是方法的名称。拼写错误的方法名称是
    proc
    ,而不是
    procA
    ——我将对其进行编辑。这在stdcall约定下是完全可以的,因为不需要保留EAX(对于返回某些内容的函数,无论如何都会将其用作返回值)。
    end
    
    .data
    
    MsgBoxCaption4 db  "before calling", 0
    MsgBoxCaption5 db  "after   calling", 0
    
    .data?
    
    N       DWORD   ?
    NTXT        db 16 dup(?)
    
    .code
    
    mov eax, N
    invoke  cx_DWToHex, addr NTXT
    invoke  MessageBox, NULL, addr NTXT, addr MsgBoxCaption4, MB_OK ; show eax as hexadecimal
    
    mov eax, N                      ;   ***** point A ****
    invoke  ProcA, addr sdt         ;   ***** point B ****
    ;   mov eax, N
    invoke  cx_DWToHex, addr NTXT
    invoke  MessageBox, NULL, addr NTXT, addr MsgBoxCaption5, MB_OK ; show eax as hexadecimal
    
    lea eax, sdt
    push eax
    call ProcA