文档介绍:第5章 ARM汇编语言程序设计
ARM伪指令
概述
ARM伪指令不属于ARM指令集中的指令,是为了编程方便而定义的。伪指令可以像其它ARM指令一样使用,但在编译时这些指令将被等效的ARM指令代替。ARM伪指令有四条,分别为ADR伪指令、ADRL伪指令、LDR伪指令、NOP伪指令。
ARM伪指令——小范围的地址读取ADR
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
ADR{cond} register,expr
ADR伪指令格式
指令执行的条件码
加载的目标寄存器
地址表达式
地址表达式expr的取指范围:
当地址值不是字对齐时,其取指范围为-255~255;
当地址值是字对齐时,其取指范围为-1020~1020;
当地址值是16字节对齐时,其取指范围将更大。
ARM伪指令——小范围的地址读取ADR
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
...
ADR R0,Delay
...
Delay
MOV R0,r14
...
应用示例(源程序):
使用伪指令将程序标号Delay的地址存入R0
...
0x20 ADD r1,pc,#0x3c
...
...
0x64 MOV r0,r14
...
ARM伪指令——小范围的地址读取ADR
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
...
ADRL R0,Delay
...
Delay
MOV R0,r14
...
应用示例(源程序):
编译后的反汇编代码:
使用伪指令将程序标号Delay的地址存入R0
地址
程序代码
ARM伪指令——小范围的地址读取ADR
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
...
ADRL R0,Delay
...
Delay
MOV R0,r14
...
应用示例(源程序):
...
0x20 ADD r1,pc,#0x3c
...
...
0x64 MOV r0,r14
...
编译后的反汇编代码:
使用伪指令将程序标号Delay的地址存入R0
ADR伪指令被汇编成一条指令
ARM伪指令——小范围的地址读取ADR
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。
应用示例(查表):
ADR R0,DISP_TAB ; 加载转换表地址
LDRB R1,[R0,R2] ; 使用R2作为参数,进行查表
…
DISP_TAB
DCB 0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8
ARM伪指令——中等范围的地址读取ADRL
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。
ADRL{cond} register,expr
ADRL伪指令格式
指令执行的条件码
加载的目标寄存器
地址表达式
地址表达式expr的取指范围:
当地址值不是字对齐时,其取指范围为-64K~64K;
当地址值是字对齐时,其取指范围为-256K~256K;
当地址值是16字节对齐时,其取指范围将更大。
ARM伪指令——中等范围的地址读取ADRL
ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以