gpt4 book ai didi

assembly - ARM立即值编码和BIC指令

转载 作者:行者123 更新时间:2023-12-01 23:51:55 28 4
gpt4 key购买 nike

我是 ARM 世界的新手。在ARM Cortex-A系列:程序员指南(第71页)中,有一个BIC指令的例子:

BIC R0, R0, #0x800

根据文本,这基本上清除了 R0 中的位 11。我知道 BIC 在这里的工作方式类似于 R0 = R0 & (~val)(请纠正我)。但我在这里不明白的是,#0x800 是如何按原样被翻译成 1000 0000 0000 的。相反,它应该按照立即编码规则分成 4 位:8 位部分。

根据我对 ARM 常量编码的理解:

0x800 = 0000 1000 0000 0000

在这些位中,我们只考虑最后 12 位用于编码,在这 12 位中 - 前 4 位决定以 2 为步长向右旋转,最后 8 位是向右旋转的数字(将其视为32 位)。所以在这种情况下,由于最后 8 位全为零,我应该在 2*8 次右旋后得到 FFFF 0000

对于上面的完整 BIC 指令,它应该被视为:

R0 = R0 & (0000 FFFF)

我知道我哪里错了。有人可以纠正我吗。

最佳答案

简短的回答是,您没有在程序集中包含编码文字字段,而是包含了您实际想要使用的有意义的值。汇编器的工作包括为指定的程序集确定(最好的,如果有的话)指令编码。


汇编器负责将汇编中提供的值编码到指令的文字字段中。 #0x800 是文字。作为汇编程序员,您只需要确保文字是可编码的。

必须计算编码旋转会很烦人且极易出错。这种类型的转换是汇编代码和机器代码之间的主要区别。要看实际生成的字面量字段,看组装后的结果。

这也导致了在某些 ISA 中看到的汇编代码和机器代码之间的一些非一对一关系。


0x800 直接是 0b1000_0000_0000

组装

BIC R0, R0, #0x800

给我

02 0B C0 E3

所以Operand2字段是0xB02。这意味着 Immediate 是 0x02,Rotate 是 0xB。取 0x00000002 并向右旋转 2 * 0xB,我们得到预期的 0x800

关于assembly - ARM立即值编码和BIC指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63360646/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com