嵌入式C语言调用汇编程序实验,C语言与汇编的嵌入式编程:汇编调用函数(两数交换)...

编写一个两数交换函数swap,具体代码如下:

#include

void swap(int *a,int *b)

{inttemp;

temp= *a;*a = *b;*b=temp;//printf("a=%d,b=%d,temp=%d\n",a,b,temp);

}

void main(){int a=0;int b=0;char *str1="a=%d,b=%d\n";

printf("++++++\n");

a=2;

b=3;

printf(str1,a,b);

swap(&a,&b);

printf(str1,a,b);

}

533e00b4d52dd2231b7b5e2ade52d42f.png

首先对main函数进行汇编转换:

#include

void swap(int *a,int *b)

{inttemp;

temp= *a;*a = *b;*b=temp;//printf("a=%d,b=%d,temp=%d\n",a,b,temp);

}

main(){int a=0;int b=0;char *str1="a=%d,b=%d\n";

printf("++++++\n");

_asm{//a=2

mov a,2

//b=3

mov b,3

//printf(str1,a,b);

mov ecx,b

push ecx

mov eax,a

push eax

mov edx,str1

push edx

call printf

add esp,12

//swap(&a,&b);

lea eax,b

push eax

lea ecx,a

push ecx

call swap

add esp,8

//printf(str1,a,b);

mov ecx,b

push ecx

mov eax,a

push eax

mov edx,str1

push edx

call printf

add esp,12}

}

现在需要将swap也转化为汇编,并放入main函数中,具体思路如下:

1、先对swap函数反汇编,并删除ret指令,

注明:swap函数大致处理过程为:把下个地址压入堆栈,然后参数入栈,然后把所有寄存器压入堆栈,分配空间,空间清C然后变量赋值开始程序然后做堆栈平衡清理堆栈

void swap(int *a,int *b)

{inttemp;

temp= *a;*a = *b;*b=temp;

}

swap:

push ebp

mov ebp,esp

sub esp,44h

push ebx

push esi

push edi

lea edi,[ebp-44h]

mov ecx,11h

mov eax,0CCCCCCCCh

rep stos dword ptr [edi]

mov eax,dword ptr [ebp+8]

mov ecx,dword ptr [eax]

mov dword ptr [ebp-4],ecx

mov edx,dword ptr [ebp+8]

mov eax,dword ptr [ebp+0Ch]

mov ecx,dword ptr [eax]

mov dword ptr [edx],ecx

mov edx,dword ptr [ebp+0Ch]

mov eax,dword ptr [ebp-4]

mov dword ptr [edx],eax

pop edi

pop esi

pop ebx

mov esp,ebp

pop ebp

ret

2、将1中的汇编代码替换掉call swap,

#includemain(){int a=0;int b=0;char *str1="a=%d,b=%d\n";

printf("++++++\n");

_asm{//a=2

mov a,2

//b=3

mov b,3

//printf(str1,a,b);

mov ecx,b

push ecx

mov eax,a

push eax

mov edx,str1

push edx

call printf

add esp,12

//swap(&a,&b);

lea eax,b

push eax

lea ecx,a

push ecx//call swap

push ebp

mov ebp,esp

sub esp,44h

push ebx

push esi

push edi

lea edi,[ebp-44h]

mov ecx,11h

mov eax,0CCCCCCCCh

rep stos dword ptr [edi]

mov eax,dword ptr [ebp+8]

mov ecx,dword ptr [eax]

mov dword ptr [ebp-4],ecx

mov edx,dword ptr [ebp+8]

mov eax,dword ptr [ebp+0Ch]

mov ecx,dword ptr [eax]

mov dword ptr [edx],ecx

mov edx,dword ptr [ebp+0Ch]

mov eax,dword ptr [ebp-4]

mov dword ptr [edx],eax

pop edi

pop esi

pop ebx

mov esp,ebp

pop ebp

add esp,8

//printf(str1,a,b);

mov ecx,b

push ecx

mov eax,a

push eax

mov edx,str1

push edx

call printf

add esp,12}

}

3、调整替换的swap汇编

#includemain(){int a=0;int b=0;char *str1="a=%d,b=%d\n";

printf("++++++\n");

_asm{//a=2

mov a,2

//b=3

mov b,3

//printf(str1,a,b);

mov ecx,b

push ecx

mov eax,a

push eax

mov edx,str1

push edx

call printf

add esp,12

//swap(&a,&b);

lea eax,b

push eax

lea ecx,a

push ecx//call swap

push ebp

mov ebp,esp

sub esp,44h

push ebx

push esi

push edi

lea edi,[ebp-44h]

mov ecx,11h

mov eax,0CCCCCCCCh

rep stos dword ptr [edi]

mov eax,a//取a地址

mov ecx,dword ptr [eax] //将a的值赋给ecx

mov dword ptr [ebp-4],ecx //temp=*a=2

mov edx,a //取a地址

mov eax,b //取b地址

mov ecx,dword ptr [eax] //取b的值3

mov dword ptr [edx],ecx //a=b=3

mov edx,b //取b地址

mov eax,dword ptr [ebp-4] //取temp的值2

mov dword ptr [edx],eax //b=temp=2

pop edi

pop esi

pop ebx

mov esp,ebp

pop ebp//add esp,8//printf(str1,a,b);

mov ecx,b

push ecx

mov eax,a

push eax

mov edx,str1

push edx

call printf

add esp,12}

}

ccc33eca2ce7bd7bdfd01756c92185ce.png

原文:https://www.cnblogs.com/little-kwy/p/12267261.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值