【发布时间】:2017-08-01 16:52:50
【问题描述】:
我正在学习 ARM 测试,我有这个代码
AREA datos, DATA, READWRITE
long EQU 7*4
serie DCD 1, 2, 4, 6, 8, 7, 9
resul DCB 0
AREA prog, CODE, READONLY
ENTRY
mov r0, #0
eor r1, r1, r1 ;result variable
ldr r2, =serie **This one**
buc ldr r3, [r2, r0]
add r1, r1, r3
add r0, r0, #4
cmp r0, #long
bne buc
ldr r2, =resul **This one**
str r1, [r2]
fin b fin
END
而且我正在用Keil调试,我的问题是我对标注的指令不是很了解。
8: mov r0, #0
0x40000000 E3A00000 MOV R0,#0x00000000
9: eor r1, r1, r1 ;result variable
10:
0x40000004 E0211001 EOR R1,R1,R1
11: ldr r2, =serie
0x40000008 E59F201C LDR R2,[PC,#0x001C]
12: buc ldr r3, [r2, r0]
0x4000000C E7923000 LDR R3,[R2,R0]
13: add r1, r1, r3
0x40000010 E0811003 ADD R1,R1,R3
14: add r0, r0, #4
0x40000014 E2800004 ADD R0,R0,#0x00000004
15: cmp r0, #long
0x40000018 E350001C CMP R0,#0x0000001C
16: bne buc
17:
0x4000001C 1AFFFFFA BNE 0x4000000C
18: ldr r2, =resul
0x40000020 E59F2008 LDR R2,[PC,#0x0008]
19: str r1, [r2]
20:
0x40000024 E5821000 STR R1,[R2]
21: fin b fin
如果我用 Keil 拆开它,我就有这个,那么我知道 LDR R2, =serie
与LDR R2,[PC, #offset] 相同,但#offset 的值放在文字池中?我不知道为什么值是0x001C。
PD:对不起我的英语,我知道它不是很好。
【问题讨论】:
-
这个问题已经被问过很多次了……
-
是的,我一直在寻找很多线程,但仍然不明白我如何知道
serie的地址手动操作。不知道如何确定#offset的值,在那种情况下是#0x001C -
你不能,汇编器/链接器可以。该值被放置在文字池中(您不知道确切的位置),并且该地址的偏移量被编码在指令中。
-
汇编语言是由汇编器定义的,所以keil arm汇编语言和gnu、arm等不应该完全相同,只有机器码要一致。因此,每个汇编器和汇编器的每个版本如何确定为这些项目分配空间的位置是特定于该汇编器的。一些汇编程序有指令,您可以使用这些指令来鼓励或指导它选择一个区域,有人会假设有些没有。同样,这种伪指令甚至可能不被所有 arm 汇编器支持...
-
指令是伪代码,简单地说请将此标签的地址加载到此寄存器中并使其正常工作。由于这部分是链接时间过程,并且指令长度是固定的,因此您无法执行所需的任何值的 mov 立即数,因此将其编码为 pc 相对负载,现在汇编器必须找到一个空间,这就是汇编器具体的。