RASM2无法重新汇编自身反汇编的ARM代码?原因与解决方案
ARM汇编转机器码失败的原因与解决办法
问题重现
在Linux环境下执行反汇编命令:
rasm2 -a arm -b 16 -d "28 46 0d f2 74 4d f0 bd"
得到反汇编结果:
mov r0, r5 addw sp, sp, 0x474 pop {r4, r5, r6, r7, pc}
但尝试将上述汇编代码重新转换为机器码时执行命令:
rasm2 -a arm -b 16 "mov r0, r5;addw sp, sp, 0x474;pop {r4, r5, r6, r7, pc};"
出现报错:
Cannot assemble 'addw sp, sp, 0x474' at line 8 invalid
错误原因
- 指令语法兼容性问题:rasm2的ARM汇编器对Thumb-2指令的语法支持与反汇编输出不一致。反汇编得到的
addw是Thumb-2的32位扩展指令,但rasm2汇编时不识别addw助记符,该指令对应的标准Thumb-2 32位加法助记符应为add.w。 - 模式匹配问题:
-b 16指定了Thumb模式,但addw属于32位Thumb-2指令,rasm2需要显式的32位Thumb-2语法格式才能正确识别指令。
解决办法
方法1:修改助记符后使用rasm2
将addw替换为add.w,执行以下命令即可成功汇编:
rasm2 -a arm -b 16 "mov r0, r5;add.w sp, sp, 0x474;pop {r4, r5, r6, r7, pc};"
执行后会输出正确的十六进制机器码:28460df2744df0bd。
方法2:使用GNU ARM汇编器(arm-none-eabi-as)
如果rasm2仍有兼容性问题,可以使用标准的GNU ARM工具链:
- 创建汇编文件
test.s,内容如下:
.syntax unified .thumb mov r0, r5 add.w sp, sp, #0x474 pop {r4, r5, r6, r7, pc}
- 执行汇编命令:
arm-none-eabi-as -mthumb test.s -o test.o
- 提取机器码:
arm-none-eabi-objcopy -O binary test.o test.bin xxd -p test.bin
输出结果同样为28460df2744df0bd。
内容的提问来源于stack exchange,提问作者rabbit
相关产品推荐
相关产品推荐

