如何解决为什么将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 举报,一经查实,本站将立刻删除。