概述
今天 2011-9-18 0:04:48 在vs2008中写了个内联汇编函数:如下
int
add_a_thousand(int x)
{
_asm{
push ecx
mov ecx,1000
mov eax,x
loop1:
inc eax
dec ecx
cmp ecx,0
jnz loop1
mov x,eax
pop ecx
}
return x;
}
int main ()
{
int j =0;
int k = 0;
k = add_a_thousand(j);
return 0;
}
主要要点 1、 _asm { }开头,{}中写的是汇编语句。
2、函数传进来的参数x,直接用。
3、mov eax,x 没有分号,没有“;"。
4、主要保存用到的寄存器,例如ecx,虽然在这个程序中也可以不用保存。
5、汇编情况,主函数在进入执行前干了些什么,add_a_thousand 和main 函数在执行前,干了些什么?执行完了又干了些什么?
反汇编:
int add_a_thousand(int x) { 009013A0 push ebp 009013A1 mov ebp,esp 009013A3 sub esp,0C0h 009013A9 push ebx 009013AA push esi 009013AB push edi 009013AC lea edi,[ebp-0C0h] 009013B2 mov ecx,30h 009013B7 mov eax,0CCCCCCCCh 009013BC rep stos dword ptr es:[edi] _asm{ push ecx 009013BE push ecx mov ecx,1000 009013BF mov ecx,3E8h mov eax,x 009013C4 mov eax,dword ptr [x] loop1: inc eax 009013C7 inc eax dec ecx 009013C8 dec ecx cmp ecx,0 009013C9 cmp ecx,0 jnz loop1 009013CC jne loop1 (9013C7h) mov x,eax 009013CE mov dword ptr [x],eax pop ecx 009013D1 pop ecx } return x; 009013D2 mov eax,dword ptr [x] ;return x; 函数的返回 一般是通过寄存器eax来传回来的。如果是return 0; 就变成了 xor eax,eax。 } 009013D5 pop edi 009013D6 pop esi 009013D7 pop ebx 009013D8 add esp,0C0h 009013DE cmp ebp,esp 009013E0 call @ILT+315(__RTC_CheckEsp) (901140h) 009013E5 mov esp,ebp 009013E7 pop ebp 009013E8 ret int main () { 00901400 push ebp 00901401 mov ebp,esp 00901403 sub esp,0D8h 00901409 push ebx 0090140A push esi 0090140B push edi 0090140C lea edi,[ebp-0D8h] 00901412 mov ecx,36h 00901417 mov eax,0CCCCCCCCh 0090141C rep stos dword ptr es:[edi] int j =0; 0090141E mov dword ptr [j],0 int k = 0; 00901425 mov dword ptr [k],0 k = add_a_thousand(j); 0090142C mov eax,dword ptr [j] 0090142F push eax 00901430 call @ILT+135(_add_a_thousand) (90108Ch) 00901435 add esp,4 00901438 mov dword ptr [k],eax return 0; 0090143B xor eax,eax } 0090143D pop edi 0090143E pop esi 0090143F pop ebx 00901440 add esp,0D8h 00901446 cmp ebp,esp 00901448 call @ILT+315(__RTC_CheckEsp) (901140h) 0090144D mov esp,ebp 0090144F pop ebp 00901450 ret
// 新的函数
void _declspec(naked) add_a_thousand(int x) // 函数被 _declspec(naked)修饰 用于创建inline的汇编代码。 { _asm{ push ecx mov ecx,1000 mov eax,x loop1: inc eax dec ecx cmp ecx,0 jnz loop1 mov x,eax pop ecx } //这里没有return 语句 在不是堆栈上的函数,return 没有意义。 } int main () { int j =0; add_a_thousand(j); return 0; }
//反汇编: void _declspec(naked) add_a_thousand(int x) //对比上面的反汇编我们可以发现这里没有函数的过程,上面的函数过程部分没有了。 { _asm{ push ecx 012F13A0 push ecx mov ecx,1000 012F13A1 mov ecx,3E8h mov eax,x 012F13A6 mov eax,dword ptr [x] loop1: inc eax 012F13A9 inc eax dec ecx 012F13AA dec ecx cmp ecx,0 012F13AB cmp ecx,0 jnz loop1 012F13AE jne loop1 (12F13A9h) mov x,eax 012F13B0 mov dword ptr [x],eax pop ecx 012F13B3 pop ecx } } int main () { 012F13C0 push ebp 012F13C1 mov ebp,esp 012F13C3 sub esp,0CCh 012F13C9 push ebx 012F13CA push esi 012F13CB push edi 012F13CC lea edi,[ebp-0CCh] 012F13D2 mov ecx,33h 012F13D7 mov eax,0CCCCCCCCh 012F13DC rep stos dword ptr es:[edi] int j =0; 012F13DE mov dword ptr [j],0 add_a_thousand(j); 012F13E5 mov eax,dword ptr [j] 012F13E8 push eax 012F13E9 call @ILT+135(_add_a_thousand) (12F108Ch) 012F13EE add esp,4 return 0; 012F13F1 xor eax,eax } 012F13F3 pop edi 012F13F4 pop esi 012F13F5 pop ebx 012F13F6 add esp,0CCh 012F13FC cmp ebp,esp 012F13FE call @ILT+315(__RTC_CheckEsp) (12F1140h) 012F1403 mov esp,ebp 012F1405 pop ebp 012F1406 ret
最后
以上就是合适洋葱为你收集整理的在C程序中内联汇编的全部内容,希望文章能够帮你解决在C程序中内联汇编所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复