Debugging 为什么ARM指令地址在我的ARM环境中不对齐?

Debugging 为什么ARM指令地址在我的ARM环境中不对齐?,debugging,assembly,gdb,arm,thumb,Debugging,Assembly,Gdb,Arm,Thumb,我的手臂环境很好 root@linaro-开发者:~#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

我的手臂环境很好

root@linaro-开发者:~#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不会再进行子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)
接头r4、r4、r4地址为0x83d1 0x83d1未对齐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

请注意,PC寄存器本身始终包含正确对齐的地址(如果没有对齐,则会出现错误)-重要的是在交互指令中写入PC的值的lsb。实际状态以CPSR的T位结束。当然,gdb选择如何表示事物可能是另一回事。代码位于0x83d0,而不是0x83d1(尽管调试器在从条目派生的对齐掩码地址显示它很有帮助)。它不起作用吗?如果跟踪它会发生什么?请注意,PC寄存器本身始终包含正确对齐的地址(如果没有对齐,则会出现错误)-重要的是在交互指令中写入PC的值的lsb。实际状态以CPSR的T位结束。当然,gdb选择如何表示事物可能是另一回事。代码位于0x83d0,而不是0x83d1(尽管调试器在从条目派生的对齐掩码地址显示它很有帮助)。它不起作用吗?如果跟踪它会发生什么?请注意,PC寄存器本身始终包含正确对齐的地址(如果没有对齐,则会出现错误)-重要的是在交互指令中写入PC的值的lsb。实际状态以CPSR的T位结束。当然,gdb选择如何表示事物可能是另一回事。代码位于0x83d0,而不是0x83d1(尽管调试器在从条目派生的对齐掩码地址显示它很有帮助)。它不起作用吗?如果跟踪它会发生什么?请注意,PC寄存器本身始终包含正确对齐的地址(如果没有对齐,则会出现错误)-重要的是在交互指令中写入PC的值的lsb。实际状态以CPSR的T位结束。美国大学