第一次在网站上提问,所以我很感激任何关于错误或改进的反馈。这就是我的问题。
任务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
我对这种材料没有经验,教授让我们学生们干了。基本上我已经找到了解码这些指令的各种方法,但我仍然有三个主要的疑问。
我不知道如何开始将二进制解码到ARM指令,这是作业的第一部分。
我找不到一些这样的后缀,例如EORS上的S是什么?是设定条件位吗?当指令前面有S时,它是否设置为1?
我不知道在一条指令行中有多个寄存器。例如:
EORS R3,R5,R10,RRx
我不明白那么多寄存器会发生什么。
非常感谢任何朝着正确方向的推动。我也搜索了ARM手册,对于那些不了解他们正在寻找什么的人来说,他们并没有太大的帮助。他们确实拥有编码和解码的大部分指令,但对我上面提到的事情几乎没有解释。
答案 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]
。
要执行相反的步骤,请在按字母顺序排列的指令列表中查找指令并按照模式进行操作。