为什么 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 上为 4 个字节 Windows,在 x86-64 上为 8 个字节 Linux; char 在 x86 上表示一个字节,在 MSP320F28x 上表示两个字节。

在 MSP430 上,语句 .word 显然表示 16 位,而语句 .long 似乎不存在于您使用的汇编器中。

因为 C 数据类型 long 在 MSP430 上是 32 位,所以对于类型 long.[=20 的一个变量需要两个 .word 语句(2x16 位) =]

C 变量类型的大小取决于作者对该编译器和目标的选择。定义上没有固定的规则。对于一个(版本)编译器,一个目标的 int 可以是 16 位,另一个目标可以是 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

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 位数字。因此,与任何此类 low-end MCU 一样,它必须依赖软件库来处理更大的类型——一旦您使用 32 位算术,编译器就会在您的代码中内联函数。这就是为什么 32 位算法在 16 bitters 上效率低下并且 非常 在 8 bitters 上效率低下的原因。

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

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

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