arm assembly note

2004年11月16日13:44:40

gcc inline assmbly 也放这吧
http://gcc.gnu.org/onlinedocs/gcc-3.2.2/gcc/Extended-Asm.html

1)
ZT FROM wanchengbuyi

注意这些指令的配对使用,例如stmdb/ldmia

2)关于!
表示数据回写
例如:
ldr r0,[r1]!
stmdb sp!,{r0,r4}
!用于前索引方式中表示数据回写,例如:ldr r0,[r1,#4]!
后索引方式不用!,数据始终回写,例如:ldr r0,[r1],#4
对堆栈方式中用!,表示堆栈自动增加或者减少


 

3)访问内存的LDR/STR指令索引方式
ldr r0,[r1,#4]前索引,先加
ldr r0,[r1],#4后索引,后加

4)比较常用的加载地址指令
Var EQU 0x1000
ldr r0, =Var
EQU生成的实际是一个标号(定义变量?),用于相对积存器寻址,与PC相对寻址相对。用EQU生成的标号用于数据段寻址。

 

5)关于DCD指令,注意与EQU不同,相应的ldr指令用法也不同.
定义一段内存区
semantec
Label DCD expr
例如:
ldr pc,Vector
    ....
Vector DCD restVector
restVector
    ....

 

(6)LTORG与LDR
LTORG是与LDR联合使用的literal pool,可以在函数尾部声明,这样相对PC偏移最少,如果不用LTORG,则编译器自动在(整个)程序末尾声名,但这样偏移有可能太大而编译不通过.

 

 

(7)ADR,ADRL,LDR,MOV加载立即数
关于这些指令的区别最好的文章是:
http://dsl.ee.unsw.edu.au/dsl-cdrom/examples/intro/pseudo.s
总结一下:
adr用来加载地址,例如adr r0,var1
ldr用来加载地址处的内容,例如ldr r0,var1
上面的这种语法只能从.text段中加载(pc偏移?)
但ldr r0,=var1可从任意段中加载地址

MOV加载8位立即数
8位立即数即第2操作数,必须可由一个8位常数循环移位偶数位得到,如0xf0000000,0xf00000001都是合法的。

ldr有伪指令和非伪指令,伪指令后面的立即数前加=
ADR在编译时会被替换成一条add或者sub指令,如果替换不了则报错。相对PC寻址
ADRL会被替换成两条指令,替换不了报错误。相对PC或者积存器寻址
这两条指令依据立即数的对齐方式不同,允许的立即数范围也不同。
LDR则是产生文字池的方式加载常量,基于PC的相对寻址,专用加载32bit立即数.

(7)stmdb与stmia
如<采用公开源码和strongarm>书中P357页所说

2007年5月30日
关于APCS最权威的ARM官方
http://www.arm.com/pdfs/aapcs.pdf
http://www.ethernut.de/en/documents/arm-inline-asm.html
这篇文章里谈到反汇编GCC时常看到的lr,fp,ip,等符号的意义.实际是APCS规定的,见
http://www.sfmcu.com/ns_detail.asp?id=500725&nowmenuid=500416&previd=500715


ADS->GCC ARM assembly porting
http://yygoing.spaces.live.com/?_c11_BlogPart_FullView=1&_c11_BlogPart_BlogPart=blogview&_c=BlogPart&partqs=amonth%3D9%26ayear%3D2006

posted on 2004-11-16 11:56  embed  阅读(2463)  评论(1编辑  收藏  举报

导航