在C程序中内联汇编

今天 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              












          

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值