咨询生成的机器代码对应ARM版本及ARMv4汇编实现方法
问题解答
我用两款汇编器(一款在线汇编器、一款FASMARM)汇编以下ARM代码:
lsl r1, r2, #4 lslge r1, r2, #4
得到小端序机器代码:
02 12 a0 e1 02 12 a0 a1
发现条件字段位于倒数第二个半字节,和书中ARMv4架构(条件字段在指令开头)的描述差异明显,现咨询:
- 上述机器代码对应哪款ARM版本?
- 如何在Linux或在线环境下将ARM代码片段汇编为ARMv4格式(仅汇编,不执行)?
1. 机器代码对应的ARM版本
你得到的这两条指令是Thumb-2指令集的编码,属于ARMv6T2及以后的版本(比如ARMv7)。Thumb-2是Thumb指令集的扩展,它的32位指令编码格式和传统ARM指令集(ARMv4属于这类)完全不同:
- 传统ARM指令(32位)的条件码字段在指令的最高4位(编码开头);
- Thumb-2的32位指令中,条件码字段位于指令的第21-24位,对应你看到的倒数第二个半字节(小端序存储下字节顺序反转后,该位置匹配编码里的条件码区域)。
你给出的第一条指令02 12 a0 e1按小端序转成32位指令是e1a01202,第二条02 12 a0 a1转成32位是a1a01202,其中a对应的条件码正是GE(大于等于),和lslge的条件匹配。
2. 汇编为ARMv4格式的方法
Linux环境下使用GNU汇编器(as)
- 编写ARMv4汇编代码文件(例如命名为
test.s),明确指定ARM指令集(而非Thumb):
.arch armv4 .arm lsl r1, r2, #4 lslge r1, r2, #4
- 执行汇编命令生成目标文件:
arm-linux-gnueabi-as -march=armv4 test.s -o test.o
- 查看或提取机器码:
# 查看反汇编及对应机器码 arm-linux-gnueabi-objdump -d test.o # 提取纯二进制机器码 arm-linux-gnueabi-objcopy -O binary test.o test.bin
最终得到的ARMv4格式机器码,条件码会位于指令开头:比如lsl r1, r2, #4的编码是e1a01204(小端序存储为04 12 a0 e1),lslge的编码是e1a012a4(小端序a4 12 a0 e1),条件码GE对应最高4位的a。
在线环境
选择支持指定ARM架构的在线汇编器,操作时直接选择ARMv4架构,并指定使用ARM指令集(而非Thumb/Thumb-2),输入代码后即可得到符合ARMv4格式的机器码。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

