【问题标题】:Converting assembly instructions to hexadecimal format?将汇编指令转换为十六进制格式?
【发布时间】:2017-09-20 15:25:12
【问题描述】:

这是作业,所以我宁愿被推向正确的方向,也不愿用勺子喂答案。

任务:为以下指令提供二进制和十六进制编码

SBC R0, R12, R6

根据教授的一些指示,我已经能够将其中的一些分解为我认为正确的二进制格式:

Cond  000  Op    S  Rn    Rd    00000000  Rm
----  ---  ----  -  ----  ----  --------  ----
1110  000  0110  0  1100  0000  00000000  0110

这是我的问题:
1) S 标志何时是1 而不是0?如何仅根据给定的汇编代码判断标志应该是 1 还是 0

2) 仅给出汇编代码,您如何确定是 I 型还是 R 型?

3) 为什么 3 位 000 和 8 位 00000000 字段不变?

编辑:处理器是 ARMv7

【问题讨论】:

  • 这适用于哪种处理器?
  • 应该是 ARM7,编辑问题以包含它
  • 看看这个pdf的第10页:)
  • 您是指 ARMv7(架构的最后一个 32 位版本)还是 ARM7(非常旧的 CPU)?我标记了 ARMv7,尽管这可能无关紧要,因为我猜所有 ARM CPU 都有 sub-with-carry。

标签: assembly arm armv7 machine-code


【解决方案1】:

使用这个PDF作为参考,可以找到第4.5节中数据处理指令的格式

                                                                点击图片放大

请记住,sbc 等指令的汇编语法是 <opcode>{cond}{S} Rd,Rn,<Op2><Op2>Rm{,<shift>},<#expression>

第 31 - 28 位

这四位是判断指令的条件代码。
如果指令中未指定条件代码后缀,则隐含 AL(始终)。
AL 编码为 1110。

第 27 - 25 位

数据处理指令前两位始终为0。
如果将立即数用作第二个操作数,则最低位为 1;如果使用寄存器,则最低位为 0。
由于r6 是第二个操作数,所以这三位都是零。

第 24 - 21 位
这是sbc 的操作码,0110。

第 20 位
这对应于汇编语法的 S 后缀。
如果设置指令设置标志,否则它们不变。

第 19 - 16 位
这是第一个操作数寄存器Rn,它是r12,因此这个字段的值为1100。

第 15 - 12 位
这是目标操作数寄存器Rd,它是r0,因此该字段必须使用0000。

位 11 - 0
此字段根据第 25 位 (bit I) 的值进行解释。
当 I = 0 时,该字段为

第 11 - 4 位
班次。
由于汇编指令中没有指定移位,因此这些位为 0。

位 3 - 0
第二个操作数寄存器Rm,这是r6,所以0110是正确的值。


您需要记住每条指令使用的格式类型。
有很多结构、模式和通用类别(如“数据处理指令”)可以定义,但最终也需要助记符(例如操作码值、位字段等......)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 2014-03-19
    • 2010-10-15
    • 2015-01-28
    • 2020-11-29
    • 2015-06-02
    • 2016-08-21
    • 2019-05-16
    相关资源
    最近更新 更多