C語言的彙編形式框架
簡單的main函數以下函數
#include <stdio.h> //自定義函數 int plus(int x,int y){ return 0; } int main(){ __asm{ mov eax,eax; mov eax,eax; mov eax,eax; } //調用函數 plus(1,2); return 0; }
其對應的彙編code
4: int plus(int x,int y){ 00401010 push ebp 00401011 mov ebp,esp 00401013 sub esp,40h //堆棧框架 ,提高棧深度40h(64D)字節 00401016 push ebx 00401017 push esi 00401018 push edi //保護寄存器 ebx esi edi 00401019 lea edi,[ebp-40h] 0040101C mov ecx,10h 00401021 mov eax,0CCCCCCCCh 00401026 rep stos dword ptr [edi] // 初始化40h字節的棧內容爲CC 5: 6: return 0; 00401028 xor eax,eax 7: } 0040102A pop edi 0040102B pop esi 0040102C pop ebx //恢復寄存器 0040102D mov esp,ebp //恢復esp 0040102F pop ebp //恢復ebp 00401030 ret //修改EIP 9: int main(){ 00410640 push ebp 00410641 mov ebp,esp 00410643 sub esp,40h //堆棧框架 ,提高棧深度40h(64D)字節 00410646 push ebx 00410647 push esi 00410648 push edi //保護寄存器 ebx esi edi 00410649 lea edi,[ebp-40h] 0041064C mov ecx,10h 00410651 mov eax,0CCCCCCCCh 00410656 rep stos dword ptr [edi] // 初始化40h字節的棧內容爲CC 10: 11: __asm{ 12: 13: mov eax,eax; 00410658 mov eax,eax 14: mov eax,eax; 0041065A mov eax,eax 15: mov eax,eax; 0041065C mov eax,eax 16: } 17: 18: //調用函數 19: plus(1,2); 0041065E push 2 00410660 push 1 //調用plus函數,遵循C調用約定,把參數按從右到左順序壓入棧,調用者負責堆棧平衡 00410662 call @ILT+5(plus) (0040100a) //調用plus函數 00410667 add esp,8 // 保存堆棧平衡 外平棧 20: 21: return 0; 0041066A xor eax,eax 22: } 0041066C pop edi 0041066D pop esi 0041066E pop ebx // 恢復寄存器 edi esi ebx 0041066F add esp,40h // 堆棧平衡 內平棧 00410672 cmp ebp,esp 00410674 call __chkesp (00410680) 00410679 mov esp,ebp 0041067B pop ebp //恢復ebp 0041067C ret // 修改eip,返回到調用入口下一地址