電子書籍の厳選無料作品が豊富!

「mov $0x616b6157,%eax 0x616b6157をeaxに代入 push %ebx ebxの内容をスタックにプッシュ push %eax eaxの内容をスタックにプッシュ mov $0x4,%edx 0x4をedxに代入 mov $0x1, %ebx 0x1をebxに代入 mov $0x4,%eax 0x4をeaxに代入 mov %esp,%ecx espの内容(スタックポインタ)をecxに代入 int $0x80 割り込み(システムコール?) pop %eax スタックからポップした内容をeaxに代入 (消費したスタックの帳尻合わせ) xor %eax,%eax eaxとeaxの排他的論理和 (0->eax。フラグレジスタのゼロビットが立つ) pop %ebx スタックからポップした内容をebxに代入 ret 呼出元に戻る」
で、元データが、
(機械語データ) (アセンブリ言語)
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
すみません。 int $0x80 割り込み(システムコール?)と、 ret 呼出元に戻るがどういう意味なのかがわかりません。教えていただけないでしょうか?すみません。

A 回答 (3件)

この質問に対する回答だけします。

悪しからず。
Linuxのわかりやすい本に関しては質問を別にすれば詳しい方が説明してくださると思います。Linuxのカテゴリーがあります。
    • good
    • 0

Linuxを知らないとわかりません。

システムコールはアプリとカーネルのインターフェースです。

x86 Linux 32bitのシステムコールの呼び出しは int 0x80です。
システムコールはEAXに格納されている数値でいろいろな処理ができます。
https://www.mztn.org/lxasm64/x86_x64_table.html
を見ていただくとWRITEのsyscall#は4です。
mov $0x4,%eax
でeaxに4を入れているので画面に出力したいのだとわかります。
WRITEの第2引数は画面に出力したい文字列が格納されているアドレスでECXに格納します。
mov %esp,%ecx
とスタックポインターのアドレスをecxに入れています。
ESPは
push eax
でEAXに格納されている$0x616b6157(Waka)がスタックに退避しています。
WRITEの第3引数は文字数です。文字数はEDXに格納します。
mov $0x4,%edx
と4が入っているので文字数は4です。
このプログラムを実行させると画面にWakaと表示して元の画面に戻ります。そのためのRETです。

C言語で書けばたった1行。
write(1,"Waka",4)
    • good
    • 0
この回答へのお礼

Linuxですが、書店で売っている本を見ればわかりますかね?教えていただけないでしょうか?話が逸脱して申し訳ないですが。

お礼日時:2021/06/17 08:04

>教えていただけないでしょうか?


無理。
あなたがどういう環境で何をしようとしてるのか不明なので。

>int $0x80 割り込み(システムコール?)と、
>ret 呼出元に戻るがどういう意味なのかがわかりません。

システムコールってのは
様々な複数の環境であってもプログラムを変更せず共通に使えるような
仕組みの1つです
ある環境内の機能を使うのに[CALL物理アドレス」じゃ
他環境で使えないでしょ
だから
特定のレジスタやスタックに引数を入れてINT命令使って呼び出して
終えて戻ってきた時にこれまた特定のレジスタやスタックに戻り値が入ってる

という仕組みになってたりするんです
    • good
    • 0

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