某些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方法返回控件是我的主要问题。