【iOS版アプリ】不具合のお知らせ

int $0x80は何の緊急処理をするものなのでしょうか?教えていただけないでしょうか?すみません。アセンブリ言語で、インテルx86です。

質問者からの補足コメント

  • うーん・・・

    どこを見ればシステムコール4番だと分かるのですか?教えていただけないでしょうか?すみません。

    No.5の回答に寄せられた補足コメントです。 補足日時:2021/06/26 21:08
  • うーん・・・

    int $0x80 はIntel x86系CPUにおけるLinuxカーネルコールで、これ自体はCPUを特権モードに移行して割り込みベクタテーブルの16進80番(10進でいうと128番)に記載されたアドレスに置かれている割り込み処理ルーチンを実行すると言うだけのこと。
    Linux OSでは割り込みベクタテーブルの16進80番にシステムコールの入口が置かれているので、これがシステムコールの呼び出しになります。
    これは、どういう意味でしょうか?教えていただけないでしょうか?すみません。16進80番に記載されたアドレスに置かれている割り込み処理ルーチンを実行すると言うだけのことというのが分かりません。教えていただけないでしょうか?すみません。

    No.7の回答に寄せられた補足コメントです。 補足日時:2021/06/27 11:40
  • うーん・・・

    つまり、割り込み処理ルーチンで、システムコールの入り口を呼び出してシステムコールの何番を呼び出すのかを 2行前を見て判断する。という事でしょうか?ルーチンは決まった手順という意味であっていますでしょうか?教えていただけないでしょうか?すみません。

    No.8の回答に寄せられた補足コメントです。 補足日時:2021/06/30 05:57
gooドクター

A 回答 (8件)

> どこを見ればシステムコール4番だと分かるのですか?


int $0x80 がシステムコール呼び出しです。システムコール呼び出し時のeaxの値がシステムコール番号です(※)から、int $0x80 の前に遡ってeaxに値を設定している命令を探します。
2行前の mov $0x4,%eax でeaxに0x4を代入しているのが最後ですから、eaxには4が入っています。だからシステムコール4番を実行しています。

※システムコール番号が呼び出し時のeax値というのはIntel x86系Linuxのシステムコール呼び出し規約です。ただこれに関する正式の文書がどこにあるかは把握していません。Linuxはオープンソースなので最悪Linuxカーネルのソースコードを読めば分かります。
この回答への補足あり
    • good
    • 0
この回答へのお礼

そのLinuxカーネルのソースコードはどこに載っていますか?URLを貼ってもらうことは可能でしょうか?教えていただけないでしょうか?すみません。

お礼日時:2021/06/27 11:29

> そのLinuxカーネルのソースコードはどこに載っていますか?


例えば下記URLの記事を参照のこと。ソースコードの読み方が書いてある。
https://qiita.com/Kernel_OGSun/items/1c0068e2bf5 …

システムコールについて詳しく知りたければ例えば下記URLを参照のこと。
https://www.kimullaa.com/entry/2020/01/05/191221
ただし、この記事はx86(32bit)ではなくx86-64(64bit)の場合の処理が書かれているのでx86とはかなり違う。
32bitの場合の説明を含むのは下記かな。
https://postd.cc/the-definitive-guide-to-linux-s …
この回答への補足あり
    • good
    • 0
この回答へのお礼

以下のURLの記事を見ても良く分かりません。もう少し分かりやすい記事を教えて頂けないでしょうか?

お礼日時:2021/06/28 13:57

>これの事です。



メラゾームさんが06/16 20:47に質問されて、回答されてるのと同一ですね。
https://oshiete.goo.ne.jp/qa/12414579.html
「C言語で書けばたった1行。
write(1,"Waka",4)」

ベストアンサーつけてないところが、何とも。

>もう少し詳しく教えていただけないでしょうか
何をもう少し詳しく知りたいのか、明確化してみては。
    • good
    • 1

> b8 04 00 00 00 mov $0x4,%eax


> 89 e1 mov %esp,%ecx
> cd 80 int $0x80

int $0x80 はIntel x86系CPUにおけるLinuxカーネルコールで、これ自体はCPUを特権モードに移行して割り込みベクタテーブルの16進80番(10進でいうと128番)に記載されたアドレスに置かれている割り込み処理ルーチンを実行すると言うだけのこと。
Linux OSでは割り込みベクタテーブルの16進80番にシステムコールの入口が置かれているので、これがシステムコールの呼び出しになります。

どのシステムコールが実行されるかは、Intel x86系CPUのLinuxの場合は呼び出し時のeaxレジスタの値なので mov $0x4,%eax からシステムコール4番(write)が呼ばれていることが分かります。
この回答への補足あり
    • good
    • 0
この回答へのお礼

もう少し詳しく教えていただけないでしょうか?すみません。

お礼日時:2021/06/26 12:16

UNIX でアセンブラを使うのに、システムコール番号を調べる方法もないというのは、信じられないのですが。



まあ、おそらくは、関数の引数(というか、スタックにある)4文字を画面に表示しているんじゃないかと思います。
    • good
    • 0

そんな事、一律では決められない。


単に、制御(実行権)をカーネルに移すだけ。

具体的に何をする為なのかは、レジスタにセットした値で決まる。

値0x1をEAXレジスタにセットした後なら、プロセスを終了させる為。
    • good
    • 0
この回答へのお礼

これの事です。
(機械語データ) (アセンブリ言語)
b8 57 61 6b 61 mov $0x616b6157,%eax
53 push %ebx
50 push %eax
ba 04 00 00 00 mov $0x4,%edx
bb 01 00 00 00 mov $0x1,%ebx
b8 04 00 00 00 mov $0x4,%eax
89 e1 mov %esp,%ecx
cd 80 int $0x80
58 pop %eax
31 c0 xor %eax,%eax
5b pop %ebx
c3 ret

お礼日時:2021/06/25 21:00

8086 で 割り込みベクタ 0x80 にシステムコールが配置されているのは、UNIX の特徴でしょう。


で、システムコールとは何をしていますかという質問は、(例えば、C言語の)標準ライブラリーは何をしていますか? というのと同じくらい漠然としています。
概ね、UNIX というOSの機能を使うには、システムコールを経由しなければなりません。

高級言語だとライブラに中に隠されていますが、アセンブラだと、int 0x80 というシステムコールの入り口が明示されているだけです。
具体的に何をしているかは、int 0x80 の前に、レジスタ(や、データ領域)に何をセットしているかで決まります。
    • good
    • 0
この回答へのお礼

これの事です。教えていただけないでしょうか?
(機械語データ) (アセンブリ言語)
b8 57 61 6b 61 mov $0x616b6157,%eax
53 push %ebx
50 push %eax
ba 04 00 00 00 mov $0x4,%edx
bb 01 00 00 00 mov $0x1,%ebx
b8 04 00 00 00 mov $0x4,%eax
89 e1 mov %esp,%ecx
cd 80 int $0x80
58 pop %eax
31 c0 xor %eax,%eax
5b pop %ebx
c3 ret

お礼日時:2021/06/25 21:00

割り込みベクタテーブルの$80番目に書かれてるアドレスの処理をします。


そこに何が書いてあるかはOSによります。
    • good
    • 0
この回答へのお礼

例えばLinuxだとどうなるのでしょうか?教えていただけないでしょうか?すみません。

お礼日時:2021/06/25 19:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング