C语言调用汇编和汇编调用C语言
来源:互联网 发布:什么人适合学编程 编辑:程序博客网 时间:2024/04/26 15:54
1.C语言调用汇编
程序的入口是main,在main里调用汇编的函数。
在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现。
在汇编里面,用EXPORT 把C语言定义的函数名引进来,再开始编写函数名开始的段
#include<stdio.h>extern int sum(int a,int b,int c,int d,int e,int f);int main(){ int result = sum(1,2,3,4,5,6); return 0; }
汇编代码可新建一个sum.asm文件,在工程中添加这个文件即可。
AREA EXAMPLE,CODE,READONLY
EXPORT sum ENTRY sum ADD R0,R0,R1 ADD R2,R2,R3 ADD R0,R0,R2 LDR R4,[SP] LDR R5,[SP,#4] ADD R4,R4,R5 ADD R0,R4,R0 BX LR END
函数传参:
4个以内的参数,直接存放在R0~R3 这4个寄存器里面。
4个以后的参数放在堆栈里。
如果函数有返回值,那么返回值放在R0里。
Debug看看编译器是怎么处理的,我们就怎样把参数取出来。
还是比较易懂
首先是
R0 =6 R1=5 R2=4 R3=3
然后把R1的值放在堆栈里,R13=5,然后R1=2
然后吧R0的值放在堆栈的下一个位置,R13+4=6,然后R0=1.
之后就是:
R0=1,R1=2,R2=3,R3=4
堆栈里面:
所以取参数的时候就是:
LDR R4,[SP];R4=5LDR R5,[SP,#4];R5=6
把相加的结果放在R0,然后BX LR返回
可以看到:
可以验证的确R0是存放返回值的。
例子:
;C语言中extern void macRM68090_WR_CMD(int cmd); R0 为cmd AREA EXAMPLE,CODE,READONLY EXPORT macRM68090_WR_CMD ENTRY macRM68090_WR_CMD;macRM68090_RS_CLR;macRM68090_CS_CLR LDR R1, =0x30 ldr r4, =0x40010C14 STR R1, [r4] ; GPIOB->BRR = 0x10; GPIOB->BRR = 0x20; ;macRM68090_8BIT_DATAOUT(cmd&0xFF00); AND R1, R0, #0xFF00LDR R3, =0x40010C0CAND R3, R3, #0X00FFORR R2, R1, R3ldr r4, =0x40010C0C STR R2, [r4];macRM68090_WR_CLR;macRM68090_WR_SET LDR R1, =0x08ldr r4, =0x40010C14 STR R1, [r4] ;GPIOB->BRR = 0x08; ldr r4, =0x40010C10 STR R1, [r4] ;GPIOB->BSRR = 0x08; ;macRM68090_8BIT_DATAOUT(((cmd<<8)&0xFF00));MOV R2, R0, LSL#8AND R2, R2, #0xFF00LDR R3, =0x40010C0CAND R3, R3, #0x00FFORR R2, R0, R3 ldr r4, =0x40010C0C STR R2, [r4] ;macRM68090_WR_CLR ; ldr r4, =0x40010C14 STR R1, [r4] ; GPIOB->BRR = 0x08; ;macRM68090_WR_SET ;macRM68090_CS_SETLDR R1, =0x28 ldr r4, =0x40010C10 STR R1, [r4] ; GPIOB->BSRR = 0x08; GPIOB->BSRR = 0x20; BX LR NOPEND;C语言中extern void macRM68090_WR_DATA(int data); R0 为data AREA EXAMPLE,CODE,READONLY EXPORT macRM68090_WR_DATA ENTRYmacRM68090_WR_DATA;macRM68090_RS_SETLDR R1, =0x10 ldr r4, =0x40010C10 STR R1, [r4] ; GPIOB->BSRR = 0x10;;macRM68090_CS_CLR LDR R1, =0x20 ldr r4, =0x40010C14 STR R1, [r4] ; GPIOB->BRR = 0x20; ;macRM68090_8BIT_DATAOUT(data&0xFF00); AND R1, R0, #0xFF00LDR R3, =0x40010C0CAND R3, R3, #0X00FFORR R2, R1, R3ldr r4, =0x40010C0C STR R2, [R4];macRM68090_WR_CLR;macRM68090_WR_SET LDR R1, =0x08ldr r4, =0x40010C14 STR R1, [R4] ;GPIOB->BRR = 0x08; ldr r4, =0x40010C10 STR R1, [R4] ;GPIOB->BSRR = 0x08; ;macRM68090_8BIT_DATAOUT(((data<<8) &0xFF00));MOV R2, R0, LSL#8AND R2, R2, #0xFF00LDR R3, =0x40010C0CAND R3, R3, #0x00FFORR R2, R0, R3ldr r4, =0x40010C0C STR R2, [R4];macRM68090_WR_CLR ; ldr r4, =0x40010C14 STR R1, [r4] ; GPIOB->BRR = 0x08; ;macRM68090_WR_SET ;macRM68090_CS_SETLDR R1, =0x28 ldr r4, =0x40010C10 STR R1, [R4] ; GPIOB->BSRR = 0x08; GPIOB->BSRR = 0x20; BX LR NOPEND
Worldsing
Keil: warning: A1581W: Added 2 bytes of padding at address
KEIL MDK编译警告:
warning: A1581W: Added 2 bytes of padding at address xxx
原因:
在Keil 里写汇编代码时如果代码尺寸不对齐,编译器自动补补警告。
处理办法:
加NOP指令,或修改对齐方式
阅读全文
0 0
- C语言调用汇编和汇编调用C语言
- C语言调用汇编
- c语言调用汇编模块
- Linux C语言调用汇编
- C语言调用嵌套汇编
- 从汇编看c语言函数调用
- ARM中汇编调用c语言
- vc6.0 c语言调用汇编
- C语言函数调用的汇编实现
- ARM汇编 C语言 C++ 相互调用
- 从汇编看c语言函数调用
- C语言函数和汇编函数相互调用(转)
- C语言函数和汇编函数相互调用
- ARM汇编冒泡排序之c语言调用汇编
- ARM汇编冒泡排序之汇编调用c语言
- 汇编和C语言
- 汇编和C相互调用
- c 语言调用汇编堆栈的详细分析
- 剑指offer:第14题输入一组数,奇数前偶数后
- awk命令使用示例
- Java 包装类(1)——装箱拆箱操作
- POJ 1203 Timetable 笔记 未完成
- Android Studio编译项目的时候报Manifest merger failed
- C语言调用汇编和汇编调用C语言
- 使用 nginx 和 rtmp 插件搭建视频直播和点播服务器
- 最小生成树
- 2.php server
- javamelody如何集成到springmvc应用
- Oracle 数据库基础练习
- AndroidStudio 安装Kotlin插件
- WEB安全:centos安装apache
- Struts2结果视图result