分析一些c ++代码的汇编代码

时间:2010-12-04 13:42:25

标签: c++ assembly

我被要求分析一个汇编代码,它是从Visual Studio IDE中的以下c ++代码生成的:

这是c ++代码:

    int plus(int a,int b);

int main()
{
    cout<<plus(2,4);
    getchar();
    return 0;
}

int plus(int a,int b)
{
    static int t=2;
    return a+b+t;
}

这是汇编代码(简化形式):

_main   PROC                        ; COMDAT

; 8    : {

    push    ebp
    mov ebp, esp
    sub esp, 192                ; 000000c0H
    push    ebx
    push    esi
    push    edi
    lea edi, DWORD PTR [ebp-192]
    mov ecx, 48                 ; 00000030H
    mov eax, -858993460             ; ccccccccH
    rep stosd

; 9    :    cout<<plus(2,4);

    push    4
    push    2
    call    ?plus@@YAHHH@Z              ; plus
    add esp, 8
    mov esi, esp
    push    eax
    mov ecx, DWORD PTR __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
    call    DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z
    cmp esi, esp
    call    __RTC_CheckEsp

; 10   :    getchar();

    mov esi, esp
    call    DWORD PTR __imp__getchar
    cmp esi, esp
    call    __RTC_CheckEsp

; 11   :    return 0;

    xor eax, eax

; 12   : }

    pop edi
    pop esi
    pop ebx
    add esp, 192                ; 000000c0H
    cmp ebp, esp
    call    __RTC_CheckEsp
    mov esp, ebp
    pop ebp
    ret 0
_main   ENDP
; Function compile flags: /Odtp /RTCsu /ZI
_TEXT   ENDS
;   COMDAT ?plus@@YAHHH@Z
_TEXT   SEGMENT
_a$ = 8                         ; size = 4
_b$ = 12                        ; size = 4
?plus@@YAHHH@Z PROC                 ; plus, COMDAT

; 15   : {

    push    ebp
    mov ebp, esp
    sub esp, 192                ; 000000c0H
    push    ebx
    push    esi
    push    edi
    lea edi, DWORD PTR [ebp-192]
    mov ecx, 48                 ; 00000030H
    mov eax, -858993460             ; ccccccccH
    rep stosd

; 16   :    static int t=2;
; 17   :    return a+b+t;

    mov eax, DWORD PTR _a$[ebp]
    add eax, DWORD PTR _b$[ebp]
    add eax, DWORD PTR ?t@?1??plus@@YAHHH@Z@4HA

; 18   : }

    pop edi
    pop esi
    pop ebx
    mov esp, ebp
    pop ebp
    ret 0
?plus@@YAHHH@Z ENDP                 ; plus
_TEXT   ENDS
END

我必须找到代码如何处理堆栈以及如何存储和检索变量? 问候。

2 个答案:

答案 0 :(得分:2)

  

推4

     

推2

     

致电?加@@ YAHHH @ Z

这会将值4和2推到堆栈上(与你在C中如何看待它们的顺序相反,记住2现在在4之上),然后调用plus。

  

mov eax,DWORD PTR _a $ [ebp]

     

添加eax,DWORD PTR _b $ [ebp]

     

添加eax,DWORD PTR?t @?1 ??加上@@ YAHHH @ Z @ 4HA

     

pop edi

     

pop esi

     

pop ebx

     

mov esp,ebp

     

pop ebp

     

ret 0

我忽略了在加号顶部的一些堆栈摆弄,但是这会从堆栈移动到eax,向它添加b(它从堆栈中获取)然后将t添加到它(我不熟悉MASM,所以我真的不确定从哪里来)。您可以看到a和b的堆栈偏移已经存储在_a和_b中,代码为8和12。这是在%eax中执行的,因为这是您粘贴函数的第一个返回值的位置。在返回之前有一些堆栈清除然后是通常的功能结尾。然后主代码将%eax推送到堆栈并调用iostream的东西,它将弹出它并将其输出到屏幕。

答案 1 :(得分:1)

以下是完整的教程: http://www.codeproject.com/KB/cpp/reversedisasm.aspx

如果您有问题,请询问具体问题?你原来的问题太宽泛了。