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

发布者:黑白之间最新更新时间:2019-11-18 来源: 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函数及用法

推荐阅读最新更新时间:2024-11-05 16:44

最简单的S3c2440UART功能测试
/******************************************* * 文件名称:UART.c * 实现功能:最基本的UART发送与接收 * 作者:无jianqi * 版本:1.0 **********************************************/ #include 2440addr.h //包含2440相关寄存器的设置 #include def.h //四个LED对应GPB5.6.7.8。 #define LED1 5 #define LED2 6 #define LED3 7 #define LED4 8 #
[单片机]
51单片机——IIC、EEPROM数据存储 C语言入门编程
IIC: I2C(Inter-Integrated Circuit)总线是由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单, 器件封装形式小,通信速率较高等优点。I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。由于其管脚少,硬件实现简单,可扩展性强等特点,因此被广泛的使用在各大集成芯片内。 (1)它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在 一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通 讯从机。 (2)一个I2C总线只使用两条总线
[单片机]
51单片机——IIC、EEPROM数据存储 <font color='red'>C语言</font>入门<font color='red'>编程</font>
单片机C语言程序设计:10s的秒表
#include #define uchar unsigned char #define uint unsigned int sbit K1=P3^7; uchar i,Second_Counts,Key_Flag_Idx; bit Key_State; uchar DSY_CODE ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //延时 void DelayMS(uint ms) { uchar t; while(ms--) for(t=0;t 120;t ); } //处理按键事件 void Key_E
[单片机]
单片机<font color='red'>C语言</font>程序设计:10s的秒表
基于C语言在8×8点阵实现9到0倒计时牌显示
基于C语言在8×8点阵实现9到0倒计时牌显示。 每个数之间为1秒间隔,采用定时器实现。 #include reg52.h sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; code unsigned char image ={ {0xFF,0xC3,0xDB,0xDB,0xC3,0xDF,0xDF,0xC3}, //要显示数字9时,对于的P0值 {0xFF,0xC3,0xDB,0xDB,0xC3,0xDB,0xDB,0xC3}, {0xFF,0xC3,0xDF,0xDF,0x
[单片机]
GNU μC/OS-II 在 S3C2440 上中断的实现
上一篇文章介绍了S3c2440的中断体系结构,今天我们来分析一下GNU-uC/OS-II在S3c2440上中断的实现。 首先找到IRQ的中断的向量,位于 2440init.S : OK ,我们通过名字找到了这个函数: OS_CPU_IRQ_ISR: STMFD SP!, {R1-R3} MOV R1, SP ADD SP, SP, #12 SUB R2, LR, #4 MRS R3, SPSR MSR CPSR_cxsf, #SVCMODE|NOINT STMFD SP!, {R2} STM
[单片机]
GNU μC/OS-II 在 S3C<font color='red'>2440</font> 上中断的实现
TQ210裸机编程——按键点灯 (二)
今天,我们选用中断法进行TQ210裸机的按键点灯编程。 #define GPC0CON *((volatile unsigned int *)0xE0200060) #define GPC0DAT *((volatile unsigned int *)0xE0200064) #define GPH0CON *((volatile unsigned int *)0xE0200C00) #define GPH0DAT *((volatile unsigned int *)0xE0200C04) #define EXT_INT_0_CON *((volatile unsigned int *)0xE0200E00) #def
[单片机]
MSP430 C语言的关键字扩展
1.interrupt 用于中断函数。 定义如下: 语法: interrupt void 函数名() 或者 interrupt void 函数名() 参数:中断函数没有参数。中断函数需要指定中断向量。 返回:中断函数一般是void,没有返回。 说明:interrupt关键字声明了在处理器发生中断时调用;函数的参数必须为空 2.monitor 使函数进入原型(atomic)操作状态。 定义如下: 语法:monitor 函数类型 函数名(参数表) 参数:该函数可以有参数,也可以没有参数。 返回:函数可以有返回,也可以没有返回。 说明:monitor关键字使得在函数执行期间禁止中断,使函数执行不可中断;在其它所
[单片机]
单片机C语言程序设计:10s 的秒表
/* 名称:10s 的秒表 说明:首次按键计时开始,再次按键暂停,第三次按键清零。 */ #include reg51.h #define uchar unsigned char #define uint unsigned int sbit K1=P3^7; uchar i,Second_Counts,Key_Flag_Idx; bit Key_State; uchar DSY_CODE ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //延时 void DelayMS(uint ms) { uchar t; while(m
[单片机]
单片机<font color='red'>C语言</font>程序设计:10s 的秒表
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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