繁体   English   中英

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

[英]Why does the C “long” data type compile to two MSP430 “.word”s?

我明白那个:

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 位,因此一个long类型的变量需要两个.word语句(2x16 位)。

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

这就是 stdint.h 的全部意义所在,它最终是编译器的一部分,并将 8、16、32、64 等大小之间的点与为该目标编译器选择的大小连接起来,特定版本的 gcc 用于 x86例如,stdint.h 预计不会与相同版本的 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

和 long long -2048 将是

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

或 long long -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的大小和范围非常重要,因为这会影响 integer 常量123的类型,用于隐式提升小 Z157DB7DF530029575518ZD36 等类型的类型等等。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM