C与汇编互调实例
来源:互联网 发布:js数组删除 编辑:程序博客网 时间:2024/05/12 04:06
C语言调用汇编实例:
extern void strcopy(char *d, const char *s); // 使用关键词extern声明strcopy extern void strcopy(char *d,const char *s);
int casm_test1()
{
const char *srcstr = "First string - source";
char dststr[] = "Second string - destination";
Uart_Printf("Before copying: \n");
Uart_Printf("%s\n %s\n", srcstr, dststr);
strcopy(dststr, srcstr); // 将源串和目标串地址传递给strcopy
Uart_Printf("After copying:\n");
Uart_Printf(" %s\n %s\n", srcstr, dststr);
return (0);
}
在另一个汇编文件中:
AREA SCopy, CODE, READONLY
EXPORT strcopy ;使用EXPORT伪操作声明本汇编程序
strcopy ; 寄存器R0中存放第1个参数,即dststr 目标字符串
; 寄存器R1中存放第2个参数,即srcstr 源字符串
LDRB r2, [r1], #1 ;[r1]=[r1]+1 R1的值(地址)加1(1个字节)
STRB r2, [r0], #1 ;[r1]=[r1]+1 R0的值(地址)加1(1个字节)
CMP r2, #0
BNE strcopy
MOV pc, lr
END
小结:在C中调用时,需要使用extern关键字进行调用声明;在相应的汇编程序中,需要使用EXPORT伪操作声明。
汇编调用C实例:
Stack_Size EQU 0x00000400 ;指定栈的大小
AREA STACK, DATA, NOINIT, READWRITE, ALIGN=3 ;声明一个数据段,初始化为0 指定后边的指令为8字节对齐
Stack_Mem SPACE Stack_Size ;分配一片内存单元用作栈空间
PRESERVE8 ;声明8字节对齐
AREA CAsm_Test2, CODE, READONLY
ENTRY
CODE32 ;通知编译器后边的指令是32对齐的arm指令
start
;初始化栈。注意栈只能先分配栈空间,并初始化后,才能使用SP指针
LDR R0, =Stack_Mem
; set its Stack Pointer
MOV SP, R0 ;设置栈指定SP,指向Stack_Mem地址空间
SUB SL, SP, #Stack_Size ;;;;;;;;;SL即R10
BL call_g
B stop
call_g
IMPORT g ;使用伪操作IMPORT声明C程序g()
MOV R0, #0x1
STR LR, [SP, #-4]! ;保存返回地址
ADD R1, R0, R0 ;假设进入程序f时,r0中值为i,r1值设为2*i
ADD R2, R1, R0 ;r2值设为3*i
ADD R3, R1, R2 ;r3值设为5*i
STR R3, [SP, #-4]! ;第五个参数5*i通过数据栈传递
ADD R3, R1, R1 ;r3值设为4*i
BL g ;调用C程序g()
NOP
ADD SP, SP, #4 ;调整数据栈指针,准备返回
LDR PC, [SP], #4 ;返回
stop
B stop
END
相应的C文件:
int g(int a, int b, int c, int d, int e)
{
return (a+b+c+d+e);
}
小结:在汇编中使用使用伪操作IMPORT声明C程序g(),进而在相应位置使用 BL g 完成调用。
- C与汇编互调实例
- 汇编与C互操作
- c,汇编互调
- 汇编与C....
- 汇编与C配合
- Keil c与汇编
- C语言与汇编
- 汇编与C语言
- vs nasm 汇编 混编 互调实例
- 汇编学习-汇编指令与C语言
- 汇编与C/C++内联嵌入汇编
- C语言反汇编入门实例
- C语言反汇编入门实例
- C语言反汇编入门实例
- C语言反汇编入门实例
- C与ARM汇编之一
- Intel 汇编与C语言
- C与汇编混合编程
- DOM
- PLSQL连接Oracle的方法
- 动态创建二维数组并赋值
- 如何清理IE8缓存
- Android ScrollView反弹效果的实现
- C与汇编互调实例
- STL中的排序
- 确保显示操作运行在UI线程 - runOnUiThread
- 边缘检测之Canny算法详谈
- java中的ArrayList类中的remove方法
- 如何设置水晶报表(crystal reports)的字段自动换行
- HDU2897:邂逅明下
- RegistryKey 操作注册表
- 【大街推荐】给明年依然年轻的我们:欲望、外界、标签、时间、人生目标、现实、后悔、和经历