![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
これが何をしているのか教えていただけないでしょうか?すみません。
これの事です。
(機械語データ) (アセンブリ言語)
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
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
① 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バイト長だ。
ヌル終端で"Waka"は5バイトの、ヌル終端とはどういう事でしょうか?なぜ5バイトなのでしょうか?教えていただけないでしょうか?
No.3
- 回答日時:
参照のために行頭に行番号を付けます。
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バイト書き込みと分かる。
この場合のスタックと、スタックポインタと、12:関数に戻ると、取り出しの所が分かりません。04が08に割り込みをしているという事でしょうか?教えていただけないでしょうか?すみません。
No.1
- 回答日時:
アセンブリ言語はCPUの命令語でメーカーから入手出来ます、
それと対比すれば分かります、mov,push,pop,int,retなどは
共通なので検索でも資料はあるでしょう、CPU内部のレジスタ
の働きなど理解が必要です、ポートのデーターをレジスタに
転送して(mov)他のデーターと計算させ(xor)結果を特定の
アドレスに出力させたりデーターを対比(push)させたり
一つ一つの動作を書き込まないとならないので大きいソフト
は無理でしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- その他(プログラミング・Web制作) x86_32のGASの擬似命令 3 2023/06/07 19:55
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- その他(プログラミング・Web制作) プログラムについて。 2 2022/04/07 18:48
- その他(動画サービス) YMM4 で MOV ファイルが読み込まれているがプレビューされない 2 2022/07/25 18:36
- ノートパソコン 拡張子の変換 6 2023/05/07 20:43
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- Mac OS MacのFinderでmovファイルのサムネイルが表示されないのと、クイックルックが出来ません。 こ 3 2023/07/24 18:40
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- IT・エンジニアリング 三菱シーケンサについて 1 2023/04/07 12:41
関連するカテゴリから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 電話番号の正規表現について
-
そのまま使っただけなのに・・...
-
プログラム言語について。
おすすめ情報
①前のXX:は何でしょうか?②10番のmovより速いのでとはなぜ速いのでしょうか?教えていただけないでしょうか?すみません。①②の質問に答えていただけると助かります。