ARM伪指令

伪指令

ADR
ADRL
ALIGN
DCx
EQUx
OPT
RISC OS 的 BASIC 汇编器提供了一组伪指令。它们不是处理器实际上能理解的指令,但可以转换成它能理解的某种东西。它们的存在能使你的程序更加简单。




ADR : 装载地址
(load Address)

ADR{后缀} <寄存器>, <标号>

它把参照的地址装载到给定寄存器中:
00008FE4 OPT l%
00008FE4 E28F0004 ADR R0, text
00008FE8 EF000002 SWI "OS_Write0"
00008FEC E1A0F00E MOV PC, R14
00008FF0 .text
00008FF0 EQUS "Hello!" + CHR$13 + CHR$10 + CHR$0
00008FFC ALIGN

下列代码有完全相同的效果:

00008FE4 OPT l%
00008FE4 E28F0004 ADD R0, R15, #4
00008FE8 EF000002 SWI "OS_Write0"
00008FEC E1A0F00E MOV PC, R14
00008FF0 .text
00008FF0 EQUS "Hello!" + CHR$13 + CHR$10 + CHR$0
00008FFC ALIGN

实际上,它们的反汇编将显示:
*MemoryI 8FE4 +18
00008FE4 : E28F0004 : ..忊 : ADR R0,&00008FF0
00008FE8 : EF000002 : ...? : SWI "OS_Write0"
00008FEC : E1A0F00E : .馉? : MOV PC,R14
00008FF0 : 6C6C6548 : Hell : STCVSTL CP5,C6,[R12],#-&120 ; =288
00008FF4 : 0A0D216F : o!.. : BEQ &003515B8
00008FF8 : 00000000 : .... : DCD &00000000

ADR 是一个很有用的指令,你不需要关心相对 R15 的偏移量(例如,我们为什么只加 4?),也不需要在一块代码上计算偏移量。可以简单的使用 ADR Rx, label 而汇编器将设法为你使用 ADD、SUB、MOV 或 MVN 中最恰当的那个指令。限制因素是你的引用范围只能是在 4096 字节中(不完全是真的,它典型的对 ADD 或 SUB 使用被循环右移的立即值,但是为了参数的一致性,我们假定范围是 4K)。

 


ADRL : 装载长地址
(load Address Long)

ADRL{后缀} <寄存器>, <标号>

BASIC 汇编器不支持它,但一些扩展支持它。
ADRL 指令使用 ADR 和 ADD,或 ADR 和 SUB 的一个组合,来生成一个更广大的可以到达的地址范围。但是它总是使用两个指令,所以可以尝试更加可运做的布置来重新组织你的那些可以使用普通的 ADR 代码。

还有,在一些汇编器中,用使用三个指令的 ADRX 来定位更大的地址。

 


ALIGN : 对齐指针
(ALIGN pointers)

ALIGN

ALIGN 指令设置 P% (如果需要的话还有 O%)来在一个字边界上对齐。通常要求它跟随着一个字符串或者一个或多个字节的数据,并切应当在更远的代码被汇编之前使用它。
BASIC 汇编器非常聪明并且有经验,如果你疏忽了,它能为你处理对齐问题...

00008FF4 OPT l%
00008FF4 E28F0004 ADR R0, text
00008FF8 EF000002 SWI "OS_Write0"
00008FFC EA000004 B carryon
00009000 .text
00009000 EQUS "unaligned text!!!" + CHR$0
00009012 .carryon
00009014 E1A0F00E MOV PC, R14


DCx : 初始化数据存储
DCx <值>

没有 DCx 指令。小‘x’表示一个可能的范围。它们是:
DCB 预备一个字节(8 位值)
DCW 预备一个半字(16 位值)
DCD 预备一个字(32 位值)
DCS 按给出的字符串的要求预备直到 255 个的字符

例如:
.start_counter
DCB 1

.pointer
DCD 0

.error_block
DCD 17
DCS "Uh-oh! It all went wrong!" + CHR$0
ALIGN
 

EQUx : 初始化数据存储
EQUx <值>

没有 EQUx 指令,小‘x’表示一个可能的范围。它们是:
EQUB 预备一个字节(8 位值)
EQUW 预备一个半字(16 位值)
EQUD 预备一个字(32 位值)
EQUS 按给出的字符串的要求预备直到 255 个的字符

简单的理解,除了名字不同之外与(上面的) DCx 完全一样。你可以使用‘=’作为 EQUB 的简写。
 


OPT : 设置汇编器选项
(set assembler Options)

OPT <值>

它设置各种汇编器选项。

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=676895


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值