1

所以我需要为类编写一个非常基本的反汇编程序,我很难弄清楚可以附加到 Thumb 指令的 S 是如何编码的。

例如,指令 0x0011 对应如下汇编代码:

movs    r1, r2

为什么不只是一个普通的mov?

同样,0x1889 对应于:

adds    r1, r1, r2

据我通过阅读参考手册可以看出,这与没有 S 的常规 add 指令的编码相同。是这样吗?更新条件标志的指令是如何发送的?

4

2 回答 2

0

gnu 汇编器非常烦人并且会弄乱指令集,但那是另一回事了。对于拇指模式,不要放 s 它会抱怨,但由于您别无选择,它总是在那里。只需执行 add r1,r2 assemble 然后反汇编,如果您仔细检查并查看与手册所述内容相关的机器指令,您也会看到添加 r1,r2,它还表明会发生更新标志

0x0011 是一个 lsl immed_5, rm, rn 所以是 lsl r1,r2,#0 不是加法。

0x1889 确实是加法 r1,r1,r2。s 在 thumb 的指令集中一点也不隐含。

于 2012-10-19T20:21:40.087 回答
0

Thumb 不S为每条指令使用条件字段,因此每条指令都是无条件的(显然,除了条件分支)。从 32 位 ARM 到 16 位 Thumb 的部分减少涉及摆脱它。在我看来,您提供的示例不应该s以开头(它们不会在本手册中使用)。

Thumb 中的条件代码由您的 ALU 指令(与 ARM 相同)隐式设置,但要访问它们,您需要使用条件分支。

于 2012-10-20T01:33:17.623 回答