|
看arm汇编遇到的几个问题,请各位达人讲解,谢谢!
[复制链接]
1.汇编程序调用C程序
C_add.c
#include
int g(int a,int b ,int c, int d ,int e)
{
return (a+b+c+d+e);
}
ARM_add.s
AREA ARM_add,CODE ,READONLY
EXPORT ARM_add
IMPORT g
ENTRY
STR LR ,[SP,#-4]! ;保存返回地址
MOV R0,#1
MOV R1,#2
MOV R2,#3
MOV R3,#4
MOV R4,#5 ;设置参数,R4用数据栈传递 ????为什么只有R4,其他的寄存器呢
STR R4,[SP,#-4]! ;只有R4,入栈了,其他的呢,
BL g ;??????如何传递的呢,R0,R1,R2...怎么没有显示的调用呢?结果为什么在R0返回呢?
ADD SP,#4 ;调用数据栈指针,准备返回
LDR PC,[SP],#4
END
2.BLX实现状态切换
AREA ...
CODE32
ARM1 ADR RO,thumb1+1 ;????
BLX RO
...
thumb1 ADD R1,R3,#1
....
BX LR
thumb1是个标号,ADR指令里面他代表一个地址,+1后,为什么不是讲地址加一。。如
0X00003 +1 =0X0004 呢?
而是把语句标号thumb1所在的地址赋值给R0,末位R0【0】置1,要跳转到THUMB指令集
????
3.目标地址由寄存器Rm表示
此时BLX指令相当于执行操作PC=Rm[0]&OXFFFFFFE,T=Rm[0]&1.....>??????为什么是与1,e的二进制码不是1110吗?
应该是Rm[0]&0.。。。结果只能是1.。但是不能实现ARM--->THUMB转换了?为什么是与1呢。。
谢谢各位了!
|
|