![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
No.7ベストアンサー
- 回答日時:
> どこを見ればシステムコール4番だと分かるのですか?
int $0x80 がシステムコール呼び出しです。システムコール呼び出し時のeaxの値がシステムコール番号です(※)から、int $0x80 の前に遡ってeaxに値を設定している命令を探します。
2行前の mov $0x4,%eax でeaxに0x4を代入しているのが最後ですから、eaxには4が入っています。だからシステムコール4番を実行しています。
※システムコール番号が呼び出し時のeax値というのはIntel x86系Linuxのシステムコール呼び出し規約です。ただこれに関する正式の文書がどこにあるかは把握していません。Linuxはオープンソースなので最悪Linuxカーネルのソースコードを読めば分かります。
そのLinuxカーネルのソースコードはどこに載っていますか?URLを貼ってもらうことは可能でしょうか?教えていただけないでしょうか?すみません。
No.8
- 回答日時:
> その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 …
No.6
- 回答日時:
>これの事です。
メラゾームさんが06/16 20:47に質問されて、回答されてるのと同一ですね。
https://oshiete.goo.ne.jp/qa/12414579.html
「C言語で書けばたった1行。
write(1,"Waka",4)」
ベストアンサーつけてないところが、何とも。
>もう少し詳しく教えていただけないでしょうか
何をもう少し詳しく知りたいのか、明確化してみては。
No.5
- 回答日時:
> 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)が呼ばれていることが分かります。
No.4
- 回答日時:
UNIX でアセンブラを使うのに、システムコール番号を調べる方法もないというのは、信じられないのですが。
まあ、おそらくは、関数の引数(というか、スタックにある)4文字を画面に表示しているんじゃないかと思います。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_16.png?8acaa2e)
No.3
- 回答日時:
そんな事、一律では決められない。
単に、制御(実行権)をカーネルに移すだけ。
具体的に何をする為なのかは、レジスタにセットした値で決まる。
値0x1をEAXレジスタにセットした後なら、プロセスを終了させる為。
これの事です。
(機械語データ) (アセンブリ言語)
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
No.2
- 回答日時:
8086 で 割り込みベクタ 0x80 にシステムコールが配置されているのは、UNIX の特徴でしょう。
で、システムコールとは何をしていますかという質問は、(例えば、C言語の)標準ライブラリーは何をしていますか? というのと同じくらい漠然としています。
概ね、UNIX というOSの機能を使うには、システムコールを経由しなければなりません。
高級言語だとライブラに中に隠されていますが、アセンブラだと、int 0x80 というシステムコールの入り口が明示されているだけです。
具体的に何をしているかは、int 0x80 の前に、レジスタ(や、データ領域)に何をセットしているかで決まります。
これの事です。教えていただけないでしょうか?
(機械語データ) (アセンブリ言語)
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- 高校 高校の倫理について!!明日中間です!!緊急教えてください。 語群があるのですが、ソクラテスが民主的な 1 2023/05/24 00:10
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ホームページのプログラムの見...
-
Pythonで仮想通貨の自動売買が...
-
このプログラミング言語のfor分...
-
vba クリップボードクリアにつ...
-
Google ColaboでGUI作成
-
ウェブサイトのアクセスログに...
-
HTMLソースが表示のページのも...
-
python 気象データの取得
-
テキストファイルの1行目のみを...
-
プログラムの起動、利用につい...
-
AIの登場でプログラマーたちが...
-
Windowsのアプリ開発ってなんの...
-
ExcelVBAでFormulaR1C1を列範囲...
-
htaccessで特定のディレクトリ...
-
powershellスクリプトで出力し...
-
Pythonで、データファイルと列...
-
VBSでテキストファイルの2行目...
-
VBA 電話番号の正規表現について
-
Webプログラムってネイティブア...
-
そのまま使っただけなのに・・...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
テキストファイルの1行目のみを...
-
Google ColaboでGUI作成
-
Python... 環境設定 初心者です...
-
AIの登場でプログラマーたちが...
-
入力された文字列が、LD22000を...
-
ITパスポートの勉強をしていま...
-
プログラミングサイトについて。
-
バッチファイルが保存されてい...
-
VBSでテキストファイルの2行目...
-
40代後半でゼロからのプログラ...
-
{ CONTROL Forms.Label.1}が...
-
Version Control on Unity
-
過剰なオブジェクト指向脳から...
-
VBAでパワーシェルを実行したい...
-
ImageMagickでgif画像の一部が...
-
正規表現 URL抽出「 [\\/\\b]{0...
-
VBA 電話番号の正規表現について
-
そのまま使っただけなのに・・...
-
プログラム言語について。
おすすめ情報
どこを見ればシステムコール4番だと分かるのですか?教えていただけないでしょうか?すみません。
int $0x80 はIntel x86系CPUにおけるLinuxカーネルコールで、これ自体はCPUを特権モードに移行して割り込みベクタテーブルの16進80番(10進でいうと128番)に記載されたアドレスに置かれている割り込み処理ルーチンを実行すると言うだけのこと。
Linux OSでは割り込みベクタテーブルの16進80番にシステムコールの入口が置かれているので、これがシステムコールの呼び出しになります。
これは、どういう意味でしょうか?教えていただけないでしょうか?すみません。16進80番に記載されたアドレスに置かれている割り込み処理ルーチンを実行すると言うだけのことというのが分かりません。教えていただけないでしょうか?すみません。
つまり、割り込み処理ルーチンで、システムコールの入り口を呼び出してシステムコールの何番を呼び出すのかを 2行前を見て判断する。という事でしょうか?ルーチンは決まった手順という意味であっていますでしょうか?教えていただけないでしょうか?すみません。