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ビットモード。