gooドクター有料プランが1ヶ月間無料!

これが何をしているのか教えていただけないでしょうか?すみません。
これの事です。
(機械語データ) (アセンブリ言語)
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

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

  • うーん・・・

    ①前のXX:は何でしょうか?②10番のmovより速いのでとはなぜ速いのでしょうか?教えていただけないでしょうか?すみません。①②の質問に答えていただけると助かります。

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

A 回答 (5件)

スタックとかスタックポインタが分からないのだと、こういうところでいくら質問しても理解できるようにならないでしょう。


アセンブラの入門書の一冊も読んでから質問された方が良いと思います。
    • good
    • 0
この回答へのお礼

08は一体何をしているのでしょうか?教えていただけないでしょうか?すみません。

お礼日時:2021/07/01 04:24

① XX:は01:とか02:とかの行番号の一般系を書いただけです。


機械語・アセンブラの各行に行番号を付けていることだけ理解できればXX:の記述は忘れて構いません。

② 実際のCPUでそうなんだから仕方ない。
ただ今のCPUだと大差ないかな。ただ機械語命令長もxorの方が短いから、アセンブラで汎用レジスタへの0代入にxorを使うのは良くあるので覚えておいて。

eaxに0をmovする命令
mov $0,%eax
は06:の例(これは0ではなく0x4をmovしているが)をみれば分かるようにマシン語だと
b8 00 00 00 00
と5バイト長になる。一方で
xor %eax,%eax
は10:に書かれているとおり
31 c0
と2バイト長だ。
    • good
    • 0
この回答へのお礼

ヌル終端で"Waka"は5バイトの、ヌル終端とはどういう事でしょうか?なぜ5バイトなのでしょうか?教えていただけないでしょうか?

お礼日時:2021/07/01 04:38

参照のために行頭に行番号を付けます。

XX:
01: b8 57 61 6b 61 mov $0x616b6157,%eax
02: 53 push %ebx
03: 50 push %eax
04: ba 04 00 00 00 mov $0x4,%edx
05: bb 01 00 00 00 mov $0x1,%ebx
06: b8 04 00 00 00 mov $0x4,%eax
07: 89 e1 mov %esp,%ecx
08: cd 80 int $0x80
09: 58 pop %eax
10: 31 c0 xor %eax,%eax
11: 5b pop %ebx
12: c3 ret

上記を一行ごとに開設すると以下の通りです。
01: 'Waka'の4文字をeaxへ 57='W', 61='a', 6b='k'
02: ebxをスタックへ (元のebxを保存するため)
03: eax(='Waka')をスタックへ
04: edxに4を代入 4は4バイトの意
05: ebxに1を代入 1は標準出力の意
06: eaxに4を代入 4はシステムコール4番(write)
07: esp(スタックポインタ)をecxに代入
08: Intel x86系Linuxでの(レガシー)システムコール
09: スタックの値をeaxに取り出し (03:で入れた値を除去するため)
10: eaxをゼロにする (同じ値のxorは常に0でmovより速いのでxorを使う)
11:スタックの値をebxに取り出し (02:で保存した値を復元するため)
12: 関数から戻る

Cで書けば
write(1,"Waka",4);
の1行で書ける内容をアセンブラで(レガシー)システムコールを使って書いたものですね。
# Cの文字列はヌル終端で"Waka"は5バイトになるので
# 完全には一緒じゃないけど、やりたいことは同じ
呼び出されたシステムコール内ではeaxが4なのでwriteシステムコールとわかり、ebxが1なので標準出力へ、ecxにスタックポインタの先頭すなわち'Waka'のアドレスがあり、edxから4バイト書き込みと分かる。
この回答への補足あり
    • good
    • 0
この回答へのお礼

この場合のスタックと、スタックポインタと、12:関数に戻ると、取り出しの所が分かりません。04が08に割り込みをしているという事でしょうか?教えていただけないでしょうか?すみません。

お礼日時:2021/06/30 18:20

https://oshiete.goo.ne.jp/qa/12414579.html
「C言語で書けばたった1行。
write(1,"Waka",4)」
「アセンブリ言語について。」の回答画像2
    • good
    • 0

アセンブリ言語はCPUの命令語でメーカーから入手出来ます、


それと対比すれば分かります、mov,push,pop,int,retなどは
共通なので検索でも資料はあるでしょう、CPU内部のレジスタ
の働きなど理解が必要です、ポートのデーターをレジスタに
転送して(mov)他のデーターと計算させ(xor)結果を特定の
アドレスに出力させたりデーターを対比(push)させたり
一つ一つの動作を書き込まないとならないので大きいソフト
は無理でしょう。
    • good
    • 0
この回答へのお礼

これが何をしているのか教えていただけないでしょうか?すみません。

お礼日時:2021/06/30 08:12

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

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

gooドクター

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

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