ARM Thumb-2 32位比较代码正确性及转十六进制工具咨询
Thumb-2代码问题分析与解决方案
1. 你的代码存在明显错误
首先得明确:你写的ldr r2, #0xAABBCCDD这条指令是无效的,无法被Thumb-2指令集识别。原因很直接——Thumb-2对立即数加载有严格的编码限制:
- 普通16位Thumb指令支持的立即数,必须是能通过8位数值循环右移偶数位得到的数值,
0xAABBCCDD是完全随机的32位常量,根本不符合这个规则。 - 就算用32位的Thumb-2扩展指令,也没法直接将这么大的立即数直接加载到寄存器中。
正确的写法
你需要用ARM汇编的伪指令ldr r2, =0xAABBCCDD来实现需求。这个伪指令会让汇编器自动把0xAABBCCDD存入程序的文字池(专门存放常量的内存区域),然后生成一条基于PC的加载指令读取该值。完整的正确代码示例:
ldr r3, [r0, #0x14] ; 从r0+0x14地址加载数据到r3 ldr r2, =0xAABBCCDD ; 把0xAABBCCDD加载到r2(伪指令,汇编器自动处理常量存储) cmp r3, r2 ; 对比r3和r2的数值 bne notCompareLabel ; 若不等则跳转到notCompareLabel
如果是手动编写机器码,你需要自行将常量放到内存中,再通过PC相对地址加载,比如:
ldr r3, [r0, #0x14] ldr r2, [pc, #4] ; 假设常量存放在当前指令往后4字节的位置 cmp r3, r2 bne notCompareLabel .word 0xAABBCCDD ; 这里就是存放常量的文字池
2. 推荐靠谱的Thumb-2转十六进制工具
专业开发场景下,最可靠的工具是GNU Binutils工具链(包含arm-none-eabi-as汇编器和arm-none-eabi-objdump反汇编器),这是ARM官方认可的标准工具,完全符合指令集规范:
- 第一步:将汇编代码保存为
.s文件,比如check_data.s - 第二步:用汇编器编译成目标文件:
arm-none-eabi-as -mthumb -o check_data.o check_data.s - 第三步:用反汇编器导出十六进制指令:
arm-none-eabi-objdump -d -marm -Mthumb check_data.o
执行后就能看到每条指令对应的十六进制机器码,结果绝对准确。
另外,如果你使用嵌入式开发IDE,比如Keil MDK或IAR Embedded Workbench,它们自带的汇编器和反汇编功能也能完美生成Thumb-2的机器码,操作更便捷。
内容的提问来源于stack exchange,提问作者g319909.nwytg.coM
相关产品推荐
相关产品推荐

