某些C++代码的汇编代码分析 我被要求分析一个汇编代码,它是由VisualStudioID:< /P>中的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; }

某些C++代码的汇编代码分析 我被要求分析一个汇编代码,它是由VisualStudioID:< /P>中的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; },c++,assembly,C++,Assembly,以下是简化形式的汇编代码: _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

以下是简化形式的汇编代码:

_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
我必须找到代码如何处理堆栈,以及如何存储和检索变量?
问候。

以下是完整的教程:

如果有,请问一个具体的问题?你原来的问题太宽泛了

推4

推2

打电话?还有@@YAHHH@Z

这会将值4和2按与您在C中的想法相反的顺序推到堆栈上,记住2现在位于4之上,然后调用加号

mov eax,DWORD PTR a$[ebp]

添加eax,DWORD PTR_b$[ebp]

加上eax、DWORD PTR?t@?1?加号@@YAHHH@Z@4HA

流行电子数据交换

波普esi

流行电子束

电除尘器

流行ebp

ret 0


我忽略了plus顶部的一些堆栈修改,但是这会将a从堆栈移动到eax中,将b添加到它从堆栈中得到的,然后将t添加到它中。我对MASM一点都不熟悉,所以我不确定t从哪里来。您可以看到a和b的堆栈偏移量已存储到_a和_b中,作为代码后面的8和12。这是在%eax中执行的,因为这是粘贴函数的第一个返回值的地方。在返回之前,会有一些堆栈清除,然后是通常的函数尾声。然后主代码将%eax推到堆栈上并调用iostream stuff,它将弹出并输出到屏幕。

代码是不言自明的。你有什么特别的问题吗?我想知道参数a和b以及静态int t存储在哪里。找不到。a和b存储在堆栈上。由于这些是参数,您可以在这里看到使用ebp指针访问这些参数:mov eax,DWORD PTR_a$[ebp]添加eax,DWORD PTR_b$[ebp]t在本指令中直接指定为常量:添加eax,DWORD PTR?t@?1加号@@YAHHH@Z@4那么静态int t如何,控件如何从plus方法返回呢?t是一个常数,我已在上述答覆中说明。两条连续的add指令是添加a+b+t并将结果存储在eax指令中。ret 0是plus方法返回的指令。查找参数的位置以及如何从plus方法返回控件是我的主要问题。