日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C到汇编[1]

發布時間:2023/12/18 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C到汇编[1] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇文字解釋這個問題:C語言函數調用在匯編語言是怎么實現的?棧模型很好的滿足了函數調用的需求,以最簡單的函數調用說明。

1 5: int add2(int a, int b){return a+b;} 2 0040B450 push ebp 3 0040B451 mov ebp,esp 4 0040B453 sub esp,40h 5 0040B456 push ebx 6 0040B457 push esi 7 0040B458 push edi 8 0040B459 lea edi,[ebp-40h] 9 0040B45C mov ecx,10h 10 0040B461 mov eax,0CCCCCCCCh 11 0040B466 rep stos dword ptr [edi] 12 0040B468 mov eax,dword ptr [ebp+8] 13 0040B46B add eax,dword ptr [ebp+0Ch] 14 0040B46E pop edi 15 0040B46F pop esi 16 0040B470 pop ebx 17 0040B471 mov esp,ebp 18 0040B473 pop ebp 19 0040B474 ret 20 21 --- No source file --------------------------------------------------------------------------------------------------------------------------------------- 22 0040B76C int 3 23 0040B76D int 3 24 0040B76E int 3 25 0040B76F int 3 26 --- e:\項目\000test\testconsole\main.cpp ----------------------------------------------------------------------------------------------------------------- 27 6: 28 7: int main(int argc, char **argv){ 29 0040B770 push ebp 30 0040B771 mov ebp,esp 31 0040B773 sub esp,4Ch 32 0040B776 push ebx 33 0040B777 push esi 34 0040B778 push edi 35 0040B779 lea edi,[ebp-4Ch] 36 0040B77C mov ecx,13h 37 0040B781 mov eax,0CCCCCCCCh 38 0040B786 rep stos dword ptr [edi] 39 8: 40 9: int a = 10; 41 0040B788 mov dword ptr [ebp-4],0Ah 42 10: int b = 20; 43 0040B78F mov dword ptr [ebp-8],14h 44 11: int c = add2(a, b); 45 0040B796 mov eax,dword ptr [ebp-8] 46 0040B799 push eax 47 0040B79A mov ecx,dword ptr [ebp-4] 48 0040B79D push ecx 49 0040B79E call @ILT+5(add2) (0040100a) 50 0040B7A3 add esp,8 51 0040B7A6 mov dword ptr [ebp-0Ch],eax 52 12: 53 13: return c; 54 0040B7A9 mov eax,dword ptr [ebp-0Ch] 55 14: } 56 0040B7AC pop edi 57 0040B7AD pop esi 58 0040B7AE pop ebx 59 0040B7AF add esp,4Ch 60 0040B7B2 cmp ebp,esp 61 0040B7B4 call __chkesp (0040b6b0) 62 0040B7B9 mov esp,ebp 63 0040B7BB pop ebp 64 0040B7BC ret

44行執行函數調用,過程如下:

(1)參數入棧,從右向左;

(2)CALL指令,注意CALL指令將EIP入棧,并JMP;

(3)初始化ADD函數堆棧,push ebp; mov ebp, esp;sub esp,0x40; push ebx; push esi; push edi; rep stos ptr dword es:[edi].? rep指令表示,執行循環,循環次數放置在ECX寄存器中;stos指令表示,將EAX值放入edi指向的地址,并將edi遞增.? 在第10行我們看到EAX被設置為0xCCCCCCCC,所以rep stos ptr dword es:[edi]的作用是,將開辟的0x40局部變量空間初始化為0xCC,0xCC是INT 3的匯編指令,目的是防止誤執行。

(4)執行ADD指令,結果存放在EAX中;

(5)恢復現場,pop ebx; pop esi; pop edi;

(6)ret,彈出eip;

(7)保持棧平衡,add esp,8;

轉載于:https://www.cnblogs.com/yuqiao-ray-vision/p/3754448.html

總結

以上是生活随笔為你收集整理的C到汇编[1]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。