ARM立即数编码和BIC指令

如何解决ARM立即数编码和BIC指令

我是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。这意味着立即数为0x02,而旋转数为0xB。取0x00000002并向右旋转2 * 0xB,我们得到预期的0x800

,

只要自己尝试一下,看看。

.syntax unified

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

Disassembly of section .text:

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

A1编码

e3c00b02

101100000010 (b02)
1011 00000010

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

00000010 0000000000
000000100000000000
000000 1000 0000 0000
0x800

T1编码

f420 6000
1111010000100000 0110000000000000
xxxxx1xxxxxxxxxx x110xxxx00000000

11100 0000000
11100 abcdefg

1bcdefg0 shifted left 3

1abc defg 0000
1000 0000 0000 
0x800

所有内容在ARM文档中都有明确描述。该指令指向文档(ARM ARM)的一部分,该部分显示了立即数的编码。这不是技巧,这是ARM。它不一定直接映射到指令中,ARM因其桶形移位器而闻名。

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

您需要有关内核的技术参考手册(ARM TRM)和该内核中的体系结构(在这种情况下为armv7-ar)的体系结构参考手册(ARM ARM)。

对于ARM(目前缺乏更好的术语,是aarch32),它是8个有效位,因此可以移位偶数次。

bic r0,#0x102

100000010 (0x102)
10000001 (0x81)

不起作用

so.s:2: Error: invalid constant (102) after fixup

但是

bic r0,#0x204

确实(0x81 >> 30)

拇指

bic r0,#0x00220022

很好,但不适合手臂

so.s:3: Error: invalid constant (220022) after fixup

只需阅读ARM文档,它就会被清楚地描述。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-