向/从二进制编码和解码ARM指令

时间:2017-02-21 18:05:58

标签: arm executable

第一次在网站上提问,所以我很感激任何关于错误或改进的反馈。这就是我的问题。

任务1:编写相应的ARM程序集表示以获取以下指示信息:

11101001_000111000001000000010000
11100100_110100111000000000011001
10010010_111110100100000011111101
11100001_000000010010000011111010 
00010001_101011101011011111001100

任务2:写下以下指令的指令代码:

STMFA R13!, {R1, R3, R5-R11} 
LDR R11, [R3, R5, LSL #2]
MOVMI R6, #1536
LDR R1, [R0, #4]!
EORS R3, R5, R10, RRX

我对这种材料没有经验,教授让我们学生们干了。基本上我已经找到了解码这些指令的各种方法,但我仍然有三个主要的疑问。

  1. 我不知道如何开始将二进制解码到ARM指令,这是作业的第一部分。

  2. 我找不到一些这样的后缀,例如EORS上的S是什么?是设定条件位吗?当指令前面有S时,它是否设置为1?

  3. 我不知道在一条指令行中有多个寄存器。例如:

    EORS R3,R5,R10,RRx
    

    我不明白那么多寄存器会发生什么。

  4. 非常感谢任何朝着正确方向的推动。我也搜索了ARM手册,对于那些不了解他们正在寻找什么的人来说,他们并没有太大的帮助。他们确实拥有编码和解码的大部分指令,但对我上面提到的事情几乎没有解释。

2 个答案:

答案 0 :(得分:1)

查看ARM架构参考手册(不是你想要的ARMv5或ARMv7-AR)的cortex-m(armv6m armv7m)的不同部分,看看拇指指令,但是ARM指令的工作方式相同,并且前面几章。

它将拇指指令设置为部分/章节,然后很快就会出现一个显示拇指指令集编码的表格,或者您可以只搜索它。一个如果它们被称为加/减寄存器,那么前面有很多硬编码的1和0,那么bit 9是opc,然后是rm,rn和rd位。

对于Windows Mac和Linux来说,很容易获得arm工具链,或者可以轻松地从源代码构建(只需要binutils)。组装这个

.thumb
add r1,r2,r3
add r1,r2,r4
add r1,r2,r5
add r1,r2,r6
add r1,r2,r7

然后反汇编给出

00000000 <.text>:
   0:   18d1        adds    r1, r2, r3
   2:   1911        adds    r1, r2, r4
   4:   1951        adds    r1, r2, r5
   6:   1991        adds    r1, r2, r6
   8:   19d1        adds    r1, r2, r7

从ARM ARM中的该图表中,添加寄存器以硬编码位000110开始,上面的指令以0x18或0x19开头,均以6位000110(00011000或00011001)开头。在按字母顺序排列的拇指指令列表中,我们查找添加说明。找到三个寄存器一个,在这种情况下它有7位碰巧匹配我们正在解码0001100的位,所以我们在正确的轨道上。最后9位是三组三个

0x1951是0001100101010001或0001100 101 010 001,后九个代表r5,r2和r1。查看指令的语法部分,它显示添加rd,rn,rm,但机器代码有rm,rn,rd,所以我们取机器代码并按语法重新排列,并添加r1,r2,r5。不错它匹配,现在不幸的是这里的s令人困惑,这个拇指指令没有一点没有空间所以这一个总是更新标志,所以这个指令和工具链的性质以及我如何使用它需要添加没有s在装配端,并与s拆卸。令人困惑,抱歉。当使用手臂指令时,字母s按预期工作。

只需在任一方向上使用ARM指令重复此操作。直接价值观将是最具挑战性的部分。或者不取决于具体的指令和即时编码。

答案 1 :(得分:1)

如果您有ARM v7 A + R架构手册(DDI0406C),则在A5章节中有一个很好的基于表格的解码/反汇编说明。从表A5.1开始,并且根据指令字中不同位的值,它引用越来越多的指向该指令的特定表。

例如,请考虑以下说明:

0001 0101 1001 1111 0000 0000 0000 1000

根据第一个表,它是一个无符号加载/存储指令,因为条件不是1111而op1是010.这个编码在A5.3中进一步扩展

从这一节我们看到A = 0,op1 = 11001,Rn = 1111(PC),B = 0。这意味着该指令是LDR(字面值)。检查描述该指令的页面并记住cond = 0001,我们看到指令是LDRNE R0, [PC, #4]

要执行相反的步骤,请在按字母顺序排列的指令列表中查找指令并按照模式进行操作。