我被要求分析一个汇编代码,它是从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
我必须找到代码如何处理堆栈以及如何存储和检索变量? 问候。
答案 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
如果您有问题,请询问具体问题?你原来的问题太宽泛了。