0

我的 ARM 环境是

root@linaro-developer:~# uname -a Linux linaro-developer 3.2.0 #7 SMP Thu Feb 28 16:20:18 PST 2013 armv7l armv7l armv7l GNU/Linux

我的大会是

.section .text
.global _start
_start:
        .code 32
        #Thumb-Mode on
        add r6, pc, #1
        bx r6
        .code 16
        sub r4, r4, r4
        mov r0, r4
        ldr r2, =0x80047dbc
        blx r2
        ldr r2, =0x80047a0c
        blx r2

但是,当我尝试使用 gdb 进行调试时,pc 不会进入 sub r4、r4、r4 gdb 状态

(gdb) x/3i $pc
=> 0x83c8: add r6, pc, #1
   0x83cc:        bx r6     ;r6 = 0x83d1
   0x83d0: stcne 11, cr1, [r0], #-144 ; 0xffffff70
(gdb) x/3i 0x83d1
   0x83d1: subs r4, r4, r4
   0x83d3: adds r0, r4, #0
   0x83d5: ldr r2, [pc, #4] ; (0x83dc)

subs r4, r4, r4 地址为 0x83d1 0x83d1 未对齐

为什么我的汇编代码位于未对齐的地址?

4

1 回答 1

3

(完整的)ARM 处理器可以在 ARM 或 Thumb 执行状态下执行指令 - 粗略地说,是完整 32 位指令字的多功能性或更有限的 16 位指令字的代码大小效率之间的差异。

当跳转到寄存器中包含的地址时,您可以使用寄存器内容的 LSB 设置 ARM 或 Thumb 状态,这似乎是您正在调试的代码正在执行的操作 - 跳转到 0x83d1 将设置 Thumb 状态,但目标指令的实际地址将是 0x83d0,它是 16 位对齐的。

相反,如果分支到立即偏移,则无法使用 LSB 设置模式,但可以在保留状态的 B/BL 或切换状态的 BX/BLX 之间进行选择。

请注意,一些用于嵌入式使用的较小 ARM 内核支持 Thumb 模式,不能执行 ARM 指令。

于 2015-02-22T17:28:55.137 回答