为什么EAX的内容有所不同?

时间:2012-04-20 21:18:37

标签: assembly x86 masm

我有两种装配方法:

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

    `.386                       ; set processor type`
    `.model flat, stdcall       ; memory model & calling convention`
    `option casemap :none       ; case sensitive`
    
    `.code`
    

    ################################################## #######################

    procA public addrSTD:DWORD
    
    ret
    
    ProcA   endp
    

    ################################################## #######################

    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
    

    ............................................... ............................................

    问题: 为什么B点A点EAX的内容不一样?

1 个答案:

答案 0 :(得分:1)

用于调用invoke的{​​{1}}指令应该获取'sdt'的地址,并将其推送到堆栈上。它很可能会生成类似于

的代码
ProcA

破坏lea eax, sdt push eax call ProcA 的内容。您可以通过查看生成代码的反汇编来验证这一点。