首先,你需要的ARM架构参考手册(ARM ARM)在infocenter.arm.com,参考手册,获得最古老的一个(或的ARMv5什么)。 所述指令集在那里很好的定义。
其次,你为什么不只是组装一些指令,并看看会发生什么?
;@test.s
cmp r1, r0
add r0, #0x1a
你有什么交叉汇编(见http://github.com/dwelch67/raspberrypi在脚本编译GCC目录,只要运行了直通binutils的那个脚本)
arm-none-linux-gnueabi-as test.s -o test.o
arm-none-linux-gnueabi-objdump -D test.o
手臂-NONE-Linux的gnueabi VS臂无小精灵VS手臂精灵等不事本,都做同样的
Disassembly of section .text:
00000000 <.text>:
0: e1510000 cmp r1, r0
4: e280001a add r0, r0, #26
一个完整的32位指令臂(未大拇指)的顶部4位是条件代码,请参阅ARM ARM条件字段部分。 一个0xE意味着永远,永远执行这一指令。 0b0000仅当量如果z标志被设置,执行,0b0001 NE只执行如果z是清晰等
在ARM ARM进军ARM指令集的ARM指令,然后按字母顺序排列,然后找到CMP它开始COND 00I10101 RN SBZ器
从我们的CMP指令中,我们发现1110 000101010001 ...所以我是一个零位15:12都是零位27:26都是零和24:21是1010,所以这是一个CMP指令
以上位19至16是项目0B001这是rn所以RN = 1(R1),用于在它告诉你看寻址模式1的数据处理的操作数的ARM ARM移位器的操作数,并具有在PDF到页面的链接
我们知道,我们希望第二个操作数仅仅是一个寄存器,被调用的数据处理操作数 - 注册,和页码,转到页页15:12上RD 11:4是零和3:0为rm 。 我们从CMP指令知道它说15:12应该是零,我不知道是否在乎,在CMP不结果存储到寄存器,所以不使用RD。 RM使用,在这种情况下,我们希望R0,所以0b0000进去3:0也注意到,它表明位27:25为零,在CMP指令25是我,我们现在知道,我们希望有一个零有这么
在CMP页面,这个数据处理之间 - 注册页面我们的全貌
1110 condition
000
1010 opcode
1 S (store flags, that is a 1 for a cmp to be useful)
0001 rn
0000 rd/dont care/sbz
00000
000
0000 rm
cmp rn,rm
cmp r1,r0
附加类似,但采用了直接的,所以去的指令阿尔法列表中的加法指令。 现在我们知道从CMP是24:21这一类的指令是操作码,我们几乎可以直行至移位操作的东西从那里继续
这一次,我们正在做的添加RD,RN,立即#
所以找了#immediate页面
和编码是
1110 condition, always
001 (note the immediate bit is set)
0100 (opcode for add for this type of instruction)
0 (S not saving the flags, it would be adds r0,r0,#26 for that)
0000 (rn = r0)
0000 (rd = r0)
现在到了有趣的部分,我们可以编码26种不同的方式。 位7:0是直接和位11:8允许立即旋转,26 0x1A的,我们可能只是简单地把0x1A的低8位,并设置旋转为0,这就是GNU汇编一样。 很可能把0x68在低8位,并在rotate_imm字段1101000 1向右旋转1 * 2位是11010 = 0x1A的= 26。