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

咨询生成的机器代码对应ARM版本及ARMv4汇编实现方法

问题解答

我用两款汇编器(一款在线汇编器、一款FASMARM)汇编以下ARM代码:

lsl   r1, r2, #4
lslge r1, r2, #4

得到小端序机器代码:

02 12 a0 e1
02 12 a0 a1

发现条件字段位于倒数第二个半字节,和书中ARMv4架构(条件字段在指令开头)的描述差异明显,现咨询:

  1. 上述机器代码对应哪款ARM版本?
  2. 如何在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)

  1. 编写ARMv4汇编代码文件(例如命名为test.s),明确指定ARM指令集(而非Thumb):
.arch armv4
    .arm
    lsl   r1, r2, #4
    lslge r1, r2, #4
  1. 执行汇编命令生成目标文件:
arm-linux-gnueabi-as -march=armv4 test.s -o test.o
  1. 查看或提取机器码:
# 查看反汇编及对应机器码
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:22:09