現在、linuxカーネルのv4.9.16のブート関係のソースコードを読んでいます。
arch/x86/kernel/head_32.S:535行目以降の下記の部分についての質問です。
lang
1535 ENTRY(early_idt_handler_array) 2536 # 36(%esp) %eflags 3537 # 32(%esp) %cs 4538 # 28(%esp) %eip 5539 # 24(%rsp) error code 6540 i = 0 7541 .rept NUM_EXCEPTION_VECTORS 8542 .ifeq (EXCEPTION_ERRCODE_MASK >> i) & 1 9543 pushl $0 # Dummy error code, to make stack frame uniform 10544 .endif 11545 pushl $i # 20(%esp) Vector number 12546 jmp early_idt_handler_common 13547 i = i + 1 14548 .fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc 15549 .endr 16550 ENDPROC(early_idt_handler_array) 17
C言語風なi = 0
やi = i + 1
等といった文が出てきていますが、これはgas特有の文法なのでしょうか。
追記
i=0 .rept 10 i = i + 1 movb $i,%al .endr
としたら,iの値が埋め込まれてリピートが展開された機械語が出力された為,
コンパイル時に計算して埋め込む様になっているのは分かりました。
.rept/.endrはマニュアルに載ってましたが,
ディレクティブのコンパイル時に変数を使えるといった様な説明はどこにあるんでしょうか。
もしかして、こういう事って当たり前の事なんでしょうか。
回答1件
あなたの回答
tips
プレビュー