我是靠谱客的博主 合适洋葱,最近开发中收集的这篇文章主要介绍在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














最后

以上就是合适洋葱为你收集整理的在C程序中内联汇编的全部内容,希望文章能够帮你解决在C程序中内联汇编所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部