You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:02:45