历史上的今天

今天是:2024年11月18日(星期一)

2019年11月18日 | 2440裸机编程之一 C语言调用汇编语言编程

发布者:黑白之间 来源: 51hei关键字:裸机编程  C语言  汇编语言 手机看文章 扫描二维码
随时随地手机看文章

一、内嵌汇编的方式,使用关键字__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
如下图:


关键字:裸机编程  C语言  汇编语言 引用地址:2440裸机编程之一 C语言调用汇编语言编程

上一篇:Mini2440裸机程序之ADC
下一篇:malloc函数及用法

推荐阅读

2018年双十一购物狂欢节尽管已经收官,但商品的配送仍然热火朝天,为了让剁手党们尽早拿到快递,快递员真的很辛苦,“双十一派件高峰,小哥熬夜抢快递柜”,“快递员三天两夜睡了不到8小时的觉”,这一类的新闻层出不穷。 最后一公里的快递配送难题如何解决,是各大物流最大痛点。人口红利消失,人力成本飙升的当下,单纯的靠招聘快递员已经不能满足配...
#include"include.h"uchar lcdtab[3][10][3]={{{0x07,0x01,0x03},{0x04,0x00,0x02},{0x06,0x03,0x01},{0x06,0x02,0x03},{0x05,0x02,0x02},{0x03,0x02,0x03},{0x03,0x03,0x03},{0x06,0x00,0x02},{0x07,0x03,0x03},{0x07,0x02,0x03}},{{0x18,0x14,0x0c},{0x10,0x10,0x00},{0x18,0x08,0x0c},{0x18,0x18,0x08},{0x10,0x1c,0x00},{0x08,0x1c,0x08},{0x08,0x1c,...
Digi-Key Electronics 拥有全球品类最丰富的电子元件库存,并且能够立即发货,其宣布已扩大产品组合,在全球分销 Mag Layers USA 的 MMD 系列模制功率电感器。此次合作是 Digi-Key Marketplace 全球拓展计划的一部分,将扩大现可为客户提供的产品范围,让 Digi-Key 的一站式商店变得前所未有的丰富。 ...
随着芯片产业的蓬勃发展,对数据传输速率的需求也与日俱增。早期的产品应用(例如:I2C、SPI等),信号速率大约为Kbps-Mbps量级,信号波长远大于传播结构的几何尺寸,基尔霍夫电压电流定律即可处理大部分电子电路现象;如今的产品,其信号速率动辄高达数Gbps(例如:DDR5 4.8Gbps以上、PCIE Gen4为16Gbps、USB3.1 Gen2为10Gbps),信号波长已小于结构几...

史海拾趣

问答坊 | AI 解惑

请教单片机大虾,恳请高手解答!

这是一个教科书的实验,本实验将产生1KHZ信号持续0.1S,停0.1S,再产生1KHZ信号持续0.1S,停0.5S,然后从头执行 #include <reg51.H> sbit buzzer=P3^3; void delay(int); void pulse_BZ(int,int,int); main() {      &nbs ...…

查看全部问答∨

6410裸奔代码问题 急!!!

最近想在6410上裸奔  但是看了好多裸奔代码  都是没有初始化DDR或者SDR   包括三星的官方裸奔功能测试包夜没有  那我就纳闷  NAND上面的8K以后的代码怎么放到SDRAM或者DDR中运行呢   ...…

查看全部问答∨

Wince4.2 驱动中的IST线程响应中断精度问题

用CE4.2写了个流接口驱动,在Init里开启下面的线程 DWORD CET_MonitorThread(PVOID pParms) {         DWORD   dwResult;         int a = 0, b = 0;         RETAILM ...…

查看全部问答∨

使用ping出现问题

-> ping "10.0.3.159",5,PING_OPT_SILENT undefined symbol: PING_OPT_SILENT 是不是要包含什么组件才能使用呢? …

查看全部问答∨

如何禁止窗口的显示

我们现在有个Mass storage camera,每次一插入USB口,电脑就会弹出一个对话框,显示U盘里面的文件. 不知道有没有什么办法让他不弹出这个文件来呢? 我想在系统驱动层,看到这个窗口就直接kill掉,不知道行不行啊? 或者修改USB驱动?这个工作量似乎太大 ...…

查看全部问答∨

中*美*爱*梯*科*技, 9月10日新班开课, 免费试听!

中*美*爱*梯*科*技, .NET外企软件工程师班将于2007年9月10日开课, 开课第一周免费试听, 欢迎大家踊跃报名参加!   中*美*爱*梯*科*技向学员郑重承诺: 百分之百保证就业, 月薪3000——8000, 就不了业者退还全部学费!    ...…

查看全部问答∨

刚收到邮件,说SEED的板子最近要发货了

刚收到邮件,说SEED的板子最近要发货了!…

查看全部问答∨

请问dsp初学者应该怎么选择

请问dsp初学者应该买开发板,还是用芯片自己做一个开发板,如果买开发板买那个系列的好,在淘宝上怎样才能搜索到呢,谢谢了…

查看全部问答∨

FPGA中dsp部分的问题

本帖最后由 青城山下 于 2014-12-18 19:07 编辑 FPGA芯片中DSP48A1模块,MULT18X18是什么东西?求告诉 CARRYINSELREG => 0, LEGACY_MODE => "MULT18X18", CREG => 1, MREG => 0, …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved