teratail header banner
teratail header banner
質問するログイン新規登録
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

2695閲覧

LinuxカーネルのソースでアセンブラなのにC言語風な構文について

mao999

総合スコア111

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

1グッド

1クリップ

投稿2017/03/28 05:09

編集2017/03/28 16:05

1

1

現在、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 = 0i = i + 1等といった文が出てきていますが、これはgas特有の文法なのでしょうか。


追記

i=0 .rept 10 i = i + 1 movb $i,%al .endr

としたら,iの値が埋め込まれてリピートが展開された機械語が出力された為,
コンパイル時に計算して埋め込む様になっているのは分かりました。
.rept/.endrはマニュアルに載ってましたが,
ディレクティブのコンパイル時に変数を使えるといった様な説明はどこにあるんでしょうか。
もしかして、こういう事って当たり前の事なんでしょうか。

yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/03/29 01:33

明示されたドキュメントは見つけられなかった(英語なので分からなかっただけという話もw)のでここに書いておきます。「当たり前の事なんでしょうか」についてですが、これが出来ないと.reptの本領を発揮出来ないというか。簡単なものなら.irp/.irpcで出来ますが。
mao999

2017/03/29 03:07

私も、英語なので分からなかっただけというのもありますw あまり詳細に踏み込み過ぎると勉強が前に向いて進んでいきませんねorz ひとまずループ変数に関しては、今回は「そういうもの」として進めることにします。
fuzzball

2017/03/29 04:23

それが良いと思います。少なくとも、30年ほど前のMASMにもあった機能ですので「当たり前」ということでいいと思います。
guest

回答1

0

ベストアンサー

この辺でしょうか?


https://sourceware.org/binutils/docs/as/Setting-Symbols.html#Setting-Symbols

5.2 Giving Symbols Other Values

A symbol can be given an arbitrary value by writing a symbol, followed by an equals sign '=', followed by an expression (see Expressions). This is equivalent to using the .set directive. See .set. In the same way, using a double equals sign '=''=' here represents an equivalent of the .eqv directive. See .eqv.

(グーグル先生翻訳)

5.2シンボルに他の値を与える

記号には記号を書いた後に等号記号 '= 'とそれに続く式(式参照)を与えて任意の値を与えることができます。 これは.setディレクティブの使用と同じです。 .setを参照してください。 同様に、二重等号記号 '=''='を使用すると、.eqv指示文と等価です。 .eqvを参照してください。


https://sourceware.org/binutils/docs/as/Operators.html#Operators

=>6 Expressions
=>6.2 Integer Expressions

6.2.2 Operators

Operators are arithmetic functions, like + or %. Prefix operators are followed by an argument. Infix operators appear between their arguments. Operators may be preceded and/or followed by whitespace.

(グーグル翻訳)

6.2.2演算子

演算子は、+や%のような算術関数です。 接頭辞演算子の後には引数が続きます。 中置演算子は引数の間に現れます。 演算子の前に空白が続く場合があります。

投稿2017/03/30 17:13

編集2017/03/30 18:03
mt08

総合スコア1825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mao999

2017/03/31 03:10

ご回答ありがとうございます。 しっかりマニュアルに載っていたのですね。 しっくりきました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問