2012年(1008)
分类:
2012-08-01 11:13:01
原文地址:ARM/C混合编程 作者:luozhiyong131
//C语言内嵌汇编
#include
#include
void enable(void)
{
__asm
{
MRS v1, CPSR
BIC v1, v1, 0x40
MSR CPSR_c, v1
}
}
void disable(void)
{
int temp;
__asm
{
MRS temp, CPSR
orr temp, temp, 0X40
msr CPSR_c, temp
}
}
int main(void)
{
enable();
disable();
return 0;
}
//C语言调用汇编文件
//少于等于4个参数传递
#include
#include
extern add4(int n1, int n2,int n3, int n4);
int main(void)
{
int temp;
temp = add4(1,2,3,4);
return 0;
}
;
; 汇编文件程序
;
export add4
AREA fun, CODE
add4
add a1, a1, a2
add a1, a1, a3
add a1, a1, a4
mov pc, lr
END
//C语言调用汇编文件
//多于4个参数传递
#include
#include
extern add4(int n1, int n2,int n3, int n4, int n5);
int main(void)
{
int temp;
temp = add4(1,2,3,4,5);
return 0;
}
;
; 汇编程序
;
export add4
AREA fun, CODE
add4
add a1, a1, a2
add a1, a1, a3
add a1, a1, a4
ldmfd sp, {v1} ; 只取出第五个参数,不要弹出,编译器会自动帮你弹出
add a1, a1, v1
mov pc, lr ; 函数返回
END
;
; 在汇编程序中调用C语言程序
; 参数传递
IMPORT add5
AREA sccdata, DATA
stack space 256
AREA scccode, CODE
ENTRY
START
ldr sp, =stack+256
mov a1, #0
mov a2, #1
mov a3, #3
mov a4, #4
mov v1, #5
stmfd sp!, {v1} ; 压栈
bl add5
ldmfd sp!, {v1} ; 弹栈
stop
mov r0, #0x18
ldr r1, =0X20026
swi 0x123456
END
//C语言调用汇编文件
//多于4个参数传递
int add5(int n1, int n2,int n3, int n4, int n5)
{
return n1+n2+n3+n4+n5;
}
;
; 在汇编程序中调用C语言程序
; 19!观察结果返回情况
;
IMPORT add5
AREA scccode, CODE
ENTRY
START
mov a1, #19
bl add5
stop
mov r0, #0x18
ldr r1, =0X20026
swi 0x123456
END
//C语言调用汇编文件
long long add5(int n)
{
long long ret = 1;
while(n != 0)
{
ret *= n;
n--;
}
return ret;
}
//GNU ARM 汇编程序
//C语言调用汇编实现字符串对换
#include
#include
extern void strswp(char *str1, char *str2);
int main(void)
{
char str1[10] = "123456789";
char str2[10] = "abcde";
strswp(str1, str2); //调汇编函数
printf("buf1 = %s\nbuf2 = %s\n",str1, str2);
return 0;
}
.text
.global strswp
strswp:
@取出字节
ldrb v1, [a1]
ldrb v2, [a2]
@结束判断
cmp v1, #0
cmpne v2, #0
beq quit
@数据对换
strb v1, [a2], #1
strb v2, [a1], #1
b strswp
quit:
mov pc, lr
.end