为什么将C“ long”数据类型编译为两个MSP430“ .word”?

如何解决为什么将C“ long”数据类型编译为两个MSP430“ .word”?

我了解:

char (1 byte)
short (2 bytes)
long (4 bytes)
long long (8 bytes)

但是在将C转换为汇编语言时,为什么还要额外的.word 0.word -1

解决方法

我不确定,但是我认为您的问题是您了解其他CPU(例如x86)上的汇编程序,并且假设.word是32位字。

但是,.word.long之类的汇编器语句和C数据类型(!)都是处理器特定的,甚至是操作系统特定的。

示例:long在x86-64 Windows上表示4字节,在x86-64 Linux上表示8字节; char表示x86上为一个字节,MSP320F28x上为两个字节。

在MSP430上,语句.word显然意味着16位,而语句.long似乎不在您使用的汇编程序中。

由于MSP430上的C数据类型long是32位,因此.word类型的一个变量需要两个long语句(2x16位)。

,

C变量类型的大小特定于该编译器和目标作者的选择。根据定义,没有固定的规则。对于一个编译器(版本),一个目标的int可以是16位,而另一个目标的int可以是32位。对于两个不同的编译器,相同的目标用户可以选择16位,另外32位。并且大小不必与通用寄存器的大小一致-作者的选择。

这就是stdint.h的全部含义,它最终是编译器的一部分,它将8、16、32、64等大小的点与为该目标(特定版本的编译器)选择的编译器大小联系起来。例如,x86的stdint.h的gcc不能与gccs msp430 stdint.h的相同版本兼容。

这里发生的事情就是您所描述的。

char (1 byte)
short (2 bytes)
long (4 bytes)
long long (8 bytes)

汇编语言是特定于汇编程序,工具而非目标的,汇编程序的作者可以选择他们选择的任何语法和助记符等。与芯片文档有些关系是理智的道路,但是对于汇编语言当然没有任何规则。特别是如何定义数据项。在这里,.word表示16位值,.byte表示8位值。

2048 = 0x0000....00800
-2048 = 0xFFFF....FF800

因此,如果您剪掉2048位的低8位,则会得到0x00,而将低16位则将获得0x0800,将低32位则得到0x00000800,所以

.byte 0x00

.word 0x0800

假设小端:

.word 0x0800
.word 0x0000

用于8、16和32位

十进制:

.byte 0

.word 2048

.word 2048
.word 0

.word 2048,0

取决于汇编程序的语法

否定版本-2048

.byte 0x00

.word 0xF800

.word 0xF800
.word 0xFFFF

该数字的8、16和32位版本

十进制

.byte 0

.word -2048

.word -2048
.word -1

一个很长的-2048应该是

.word -2048
.word -1
.word -1
.word -1

或长-2048也可以实现为:

.byte 0
.byte -8
.byte -1
.byte -1
.byte -1
.byte -1
.byte -1
.byte -1

在二进制文件中都生成完全相同的数据。

,

MSP430是16位CPU,因此它不支持32位数字的硬件。像任何此类低端MCU一样,因此必须依靠软件库来处理较大的类型-使用32位算术运算器后,编译器将在代码中内联此函数。这就是为什么32位算术对16位苦味者效率低而非常对8位苦味性效率低的原因。

术语“字”相当宽泛,但通常是指CPU可以存储在数据寄存器中并在单个指令中处理的最大数据块。这个“字长”使MSP430成为“ 16位”。在C语言中,“单词”对应于类型int,因此在该系统上为16位。

在C语言中进行编程时,了解int的大小和范围非常重要,因为那会影响整数常量123的类型,该类型用于隐式提升小整数类型和等等。

尽管在对嵌入式系统进行编程时,永远不要显式使用这些类型中的任何一种,但应使用stdint.h中的类型。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <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,添加如下 <property name="dynamic.classpath" value="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['font.sans-serif'] = ['SimHei'] # 能正确显示负号 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 -> 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("/hires") 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<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-