UNIX / Linux中的默认单词大小

Modified on: Wed, 11 Jul 2018 06:19:30 +0800

我正在检查我的C程序的预处理输出,并碰巧查看头文件wordsize.h

它位于
/usr/include/i386-linux-gnu/bits/wordsize.h

该文件只包含一个宏

#define __WORDSIZE   32

我的问题是,单词是否由安装的编译器决定,或者它与我安装的操作系统(32位或64位)有关或是否与硬件有关配置我的机器。

我不熟悉Linux下的开发。

最佳答案

一般情况下,决定使用wordsize编译时的目标体系结构。您的编译器通常使用wordsize编译当前系统。

使用gcc(以及其他)你也可以使用各种标志来调整它。例如。在64位主机上,您可以编译32位机器,或强制 32位字。

-m32  # int, long and pointer to 32 bits, generates code for i386.
-m64  # int, long and pointer to 64 bits, generates code for x86-64.
-mx32 # int, long and pointer to 32 bits, generates code for x86-64.

您还应该查看limits.hinttypes.h以查看此用法
定义


对于交叉编译,请查看multilib(SO 上的 32位链接)并搜索网络。

通过以下方式检查GCC构建的标志:

gcc -v


关于尺寸,它们通常与中央处理单元密切相关
和相关的 - 例如内存地址的最大大小,CPU寄存器的大小

为了快速了解一下,您不需要了解这一点,而是依赖于此
的地方,它可以提供一些见解:

如果您使用gcc并使用-S标志进行编译,您还可以查看汇编指令。在这里,有点令人困惑,例如32位机器a
字是16位,长是32位。 ( __ WORDSIZE )

所以,例如__WORDSIZE表示移动很长(32位 - movl $123, %eax__WORDSIZE 123寄存器eax表示移动字(16位)。


这是命名约定,而且只是说movw可能意味着更多
然后有一件事。你也可以遇到代码,例如定义一些东西

#define WORD_SIZE 16

因为这一切都取决于背景。如果您从文件或流中读取数据
source的字大小为16位,这很自然。只是指出这一点
在代码中读取时,不要总是假设字大小意味着#define WORD_SIZE 16


用户定义__WORDSIZE的示例不会影响到的指令集
生成的机器代码。对于GCC,我建议这本书(不幸的是它有点旧 - 但还没有找到类似易读的更新的书。(并不是说我看起来很难。)它简短,简洁,甜美。如果你只保留在 注意事情本来可以改变,例如添加的功能等,它给予了很好的介绍。)

它在编译时快速而精彩地介绍了各个方面。
查看第11章,了解一个很好的编译链解释。< / p>


我不知道GCC编译16位的任何选项。一种方法是
是使用WORD_SIZE编写程序集来指示代码应该是16位。

示例:

    .file "hello.s"
    .text
    .code16            /* Tel GAS to use 16-bit instructions. */
.globl start, _start
start:
_start:
    movb $0x48, %al
        ...

这需要例如引导装载程序,如GRUB和LILO代码
出现在硬盘上的 .file "hello.s" .text .code16 /* Tel GAS to use 16-bit instructions. */ .globl start, _start start: _start: movb $0x48, %al ... 上。

原因是当您的计算机启动时,CPU处于特殊状态
模式,它没有32位但最大16位指令AKA
Real Mode

简而言之,BIOS会进行硬件测试
将启动盘的前512个字节加载到内存中并将控制权保留在内存中
该代码从地址MBR开始。该代码依次定位于下一阶段
驻留文件,将它们加载到内存中并继续执行最后输入
保护模式,其中正常 32-位模式。

作者:Community,Runium

相关问答

添加新评论