在ARM汇编语言编程中,伪指令并非真正的机器指令,他们不被处理器直接执行,而是由汇编器在预处理阶段处理。这些伪指令帮助程序员完成变量初始化、代码组织和优化等工作,简化编程过程。
一、ARM常用伪指令指令分析
相关问题
设定链接地址
链接地址代表汇编指令第一条指令的地址
仿汇编窗口
1.1 LDR R1,=0X12345678 分析
总结:编译器在编译的时候将 ldr r1,=0x12345678 编译为 ldr r1,[pc,#0x0008] 这一条读内存的指令。将PC寄存器的值加上偏移量算出0x12345678这个值所占据的内存的地址,然后将这个地址的数据读取进 r1 寄存器中。
1.2 LDR R1,=Label 分析
将标签对应的下条指令的地址读入 r1 中
总结:LDR R1,=Label 指令表示将label的地址写入 r1,label的地址由指定的代码段运行地址 (-T text=地址值)来决定。
编译器的做法:
- 首先根据指定的代码段开始的地址,算出label标签对应的地址值
- 然后将这个地址值存放在一个位置
- 生成内存访问指令,根据 pc+固定偏移量,找到标签对应地址存放的位置在
注意:
当代码编译结束时,标签所表示的地址值(根据指定的代码段地址)已经编译死存放在程序文件中。
1.3 LDR R1,Label 分析
LDR R1,Label 表示读取 label 表示的地址对应的数据
1.4 ADR R1,Label 分析
ADR R0,Label 指令表示根据当前的PC的值 +/- 偏移量,动态获取当前Label所表示的内存地址。
1.5 如何判别代码在实际内存中的运行的地址?
ADR R0,_start 可以知道,因为adr命令是根据PC寄存器的值动态获取地址;
LDR R0,=start 无法知道,这条指令无论在哪里执行,R0的值都是固定的(取决于指定的链接地址)
ADR和LDR所获得的值可能是相同的,但两者的原理是不同的:ADR是加法指令,LDR是内存访问指令,即ADR是动态访问内存,LDR是静态访问内存。