找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5430|回复: 4
打印 上一主题 下一主题
收起左侧

2440裸机编程之一 C语言调用汇编语言编程

[复制链接]
跳转到指定楼层
楼主
ID:68618 发表于 2014-11-12 14:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、内嵌汇编的方式,使用关键字__asm{汇编指令……},这种方式操作简单,但是限制很多,比如:不能写PC、不支持标号表达式等等,许多正常的汇编指令和伪指令都不用。
下面是个例子:
//******************************************
int x = 3;
int y = 5;
int z;

int main(void)
{
__asm
{
  MOV R0,x
  MOV R1,y
  ADD R0,R0,R1
  MOV z,R0
}
while(1);
}
//******************************************

结果即z=x+y
如图



二、调用外部汇编的方式
1) 如果参数不超过4个,依靠R0-R3传递,程序如下:
//******************************************
//main.C
int z;
extern int add(int,int); //外部链接
int main(void)
{
z = add(3,5);
while(1);
}
//******************************************

;*********************************************
;add.S
EXPORT add

AREA add,CODE,READONLY
CODE32

ADD R0,R0,R1
MOV PC,LR  ;返回

END
;*********************************************
仿真结果: z=3+5
如下图:



2) 如果参数超过4个,前四个用R0-R3传递,其余用堆栈传递,程序如下:
//******************************************
//main.C
int z;
extern int add(int,int,int,int,int); //外部链接
int main(void)
{
z = add(1,2,3,4,5);
while(1);
}
//******************************************

;*********************************************
;add.S
EXPORT add

AREA add,CODE,READONLY
CODE32


ADD R0,R0,R1
ADD R0,R0,R2
ADD R0,R0,R3
LDR R1,[SP]  ;取出第五个参数
ADD R0,R0,R1
ADD SP,SP,#4 ;调整堆栈指针,找到返回地址
MOV PC,LR  ;返回

END
;*********************************************

仿真结果: z=1+2+3+4+5
如下图:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:58502 发表于 2014-11-12 15:58 | 只看该作者
正好刚买了2440就看到这教程,真是及时雨啊
回复

使用道具 举报

板凳
ID:713846 发表于 2020-7-31 17:30 | 只看该作者
感谢,对刚开始学的我很有帮助
回复

使用道具 举报

地板
ID:382728 发表于 2021-11-18 16:32 | 只看该作者
感谢,对刚开始学的我很有帮助
回复

使用道具 举报

5#
ID:138149 发表于 2021-11-26 07:31 | 只看该作者
现在用M4,照样可以参考
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表