Debugging 为什么ARM指令地址在我的ARM环境中不对齐?
我的手臂环境很好 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 我的集会是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
.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位结束。美国大学