首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARM直接值编码与BIC指令

ARM直接值编码与BIC指令
EN

Stack Overflow用户
提问于 2020-08-11 14:45:32
回答 2查看 712关注 0票数 2

我刚开始武装世界。在ARM Cortex-A系列:程序员指南(第71页)中,有一个关于BIC指令的例子:

代码语言:javascript
复制
BIC R0, R0, #0x800

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

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

代码语言:javascript
复制
0x800 = 0000 1000 0000 0000

在这些比特中,我们只考虑最后12位用于编码,在这12位中,前4位决定2步的右旋转,最后8位是正确旋转的数(考虑32位)。所以在这种情况下,由于最后8个位都是零,我应该在2*8正确旋转后得到FFFF 0000

对于上述完整的BIC指令,应将其视为:

代码语言:javascript
复制
R0 = R0 & (0000 FFFF)

我知道我错了。谁能帮我纠正一下。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-11 14:51:12

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

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

这将是烦人和难以置信的错误,必须计算编码旋转。这种类型的转换是程序集和机器代码之间很大的区别。要查看实际生成的文字字段,请查看组装后的结果。

这也导致了一些ISAs中的程序集和机器代码之间的一些非1到1的关系。

0x800直接是0b1000_0000_0000

拼装

代码语言:javascript
复制
BIC R0, R0, #0x800

给我

代码语言:javascript
复制
02 0B C0 E3

所以Operand2字段是0xB02。这意味着直接的是0x02,旋转是0xB。取0x00000002,通过2 * 0xB旋转,得到期望的0x800

票数 4
EN

Stack Overflow用户

发布于 2020-08-11 16:15:59

你自己试试就行了。

代码语言:javascript
复制
.syntax unified

bic r0,r0,#0x800
.thumb
bic r0,r0,#0x800

Disassembly of section .text:

00000000 <.text>:
   0:   e3c00b02    bic r0, r0, #2048   ; 0x800
   4:   f420 6000   bic.w   r0, r0, #2048   ; 0x800

A1编码

代码语言:javascript
复制
e3c00b02

101100000010 (b02)
1011 00000010

将位模式00000010右移11*2位,与左10位置相同

代码语言:javascript
复制
00000010 0000000000
000000100000000000
000000 1000 0000 0000
0x800

T1编码

代码语言:javascript
复制
f420 6000
1111010000100000 0110000000000000
xxxxx1xxxxxxxxxx x110xxxx00000000

11100 0000000
11100 abcdefg

1bcdefg0 shifted left 3

1abc defg 0000
1000 0000 0000 
0x800

在ARM文档中都有清楚的描述。指令指向文档( ARM )的一部分,该部分显示直接位的编码。这不是mips,这是ARM;它不一定直接映射到指令中,ARM因其桶形移位器而闻名。

我避免使用ARM的一个文档(类型)是程序员指南,它不是他们更好的文档之一。

您需要有关核心的技术参考手册(ARM TRM)和该核心中的体系结构的架构参考手册( ARM ) (本例中为armv7 7-ar)。

对于ARM (现在缺少一个更好的术语的aarch32)来说,有8个重要的比特可以被平数地移动,所以

代码语言:javascript
复制
bic r0,r0,#0x102

100000010 (0x102)
10000001 (0x81)

不管用

代码语言:javascript
复制
so.s:2: Error: invalid constant (102) after fixup

代码语言:javascript
复制
bic r0,r0,#0x204

30 (0x81 >> 30)

大拇指

代码语言:javascript
复制
bic r0,r0,#0x00220022

很好,但对手臂来说不是

代码语言:javascript
复制
so.s:3: Error: invalid constant (220022) after fixup

只需阅读ARM的文档,就可以清楚地描述。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63360646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档