UNIX/Linux の基本単語長

UNIX/Linux の基本単語長

Cプログラムの前処理された出力を確認している間、偶然にヘッダファイルを見るようになりました。wordsize.h

位置しています /usr/include/i386-linux-gnu/bits/wordsize.h

ファイルにマクロが1つしか含まれていません。

#define __WORDSIZE   32

私の質問は、単語の長さがインストールされているコンパイラによって決定されるのか、それとも私がインストールしたオペレーティングシステム(32ビットまたは64ビット)に関連しているのか、それとも私のハードウェア構成に関連しているのかということです。マシン。

私はLinuxで開発するのが初めてです。

ベストアンサー1

一般的に言えば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.hあります。inttypes.h


クロスコンパイル確認のためSOの32ビットリンク)Webを検索してみてください。

GCCがどのフラグで構築されているかを確認してください。

gcc -v

サイズは通常、メモリアドレスの最大サイズ、CPUレジスタサイズなど、CPUと密接に関連しています。

簡単な概要のために多くを知る必要はありませんが、状況によって異なります。どこにこれはいくつかの洞察を提供できます。

gccそのフラグを使用してコンパイルすると、以下-Sも表示されます。組立説明書。ここでは少し混乱しています。たとえば、32ビットシステムでは、単語は16ビット、長さは32ビットです。 ( __WORDSIZE)

たとえば、movl $123, %eax長いシフト(32ビット - __WORDSIZE)を意味します。123 eax登録するmovw移動ワード(16ビット)を表します。


これは命名規則であり、単に言うだけでいくつかのWORDSIZE意味を持つことができます。たとえば、次のようなものを定義するコードを見つけることができます。

#define WORD_SIZE 16

なぜなら、それはすべて状況に依存するからです。ソースワードサイズが16ビットのファイルまたはストリームからデータを読み取る場合、これは自然な現象です。指摘する場合は、__WORDSIZEコードを読むときは常に単語サイズを想定しないでください。


カスタム例は、WORD_SIZE生成された機械語コードの命令セットには影響しません。 GCCの場合、提案したいと思います。この本(残念ながら、少し古い本ですが、似たような最新の本を簡単に読むことができる本が見つかりませんでした。しかし、まだ良い紹介を提供します。

コンパイル時間のさまざまな側面をすばやく効果的に紹介します。見ている第11章コンパイルチェーンの良い説明です。


16ビット用にコンパイルするためのGCCのオプションはわかりません。 1つの方法は、.code16コードが16ビットでなければならないことを示すためにアセンブリ言語で書くことです。

例:

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

MBRたとえば、GRUBやLILOなどのブートローダでは、ハードドライブにコードを保存する必要があります。

これは、コンピュータの起動時にCPUが32ビット命令を持たず、最大16ビット命令(AKA)を持つ特殊モードにあるためです。 リアルモード

つまり、BIOSはハードウェアテストを実行し、ブートディスクの最初の512バイトをメモリにロードし、コントロールはアドレスから始まるコードに任せます0。コードは次のステップファイルの場所を順番に見つけてメモリにロードし、実行を続け、最後に次のステップファイルの場所を見つけます。 保護モードどこにノーマル32ビットモード。

おすすめ記事