[解決済み] at&tアセンブリの「push」と「pushq」の違いは何ですか?
質問内容
最近、パソコンの仕組みをより深く理解するための探求を始めたところです。私の質問は、pushとpushqの違いについてです。
pushがスタックに値を書き込むことは知っていますが、pushqも同じようなことをすると思っています。qがあるということは、微妙な違いがあるはずだと思うのですが、どうもその違いがよくわからないのです。
gdb の 'layout asm' コマンドを使用して /lib/udev/iphone-set-info ファイルをデバッグしているときに、この質問について熟考していることを述べました。
問題のコードは:
pushq $0x0
push %r9
0x0は16進数でNULLを表し、%r9は一般レジスタの1つであることは理解しました。これは、NULLがスタックに書き込まれ、その上にレジスタ%r9が書き込まれるということだけでしょうか?
解決方法は?
どのようなアセンブリ言語をお使いかわかりませんが、AT&T構文を使うGAS(GNU Assembler)でも同じことが言えます。GAS のアセンブリ命令には、一般に "b", "s", "w", "l", "q", "t" という文字が付加されて、操作するオペランドのサイズを決定しています。
- b = バイト(8ビット)
- s = ショート(16ビット整数)またはシングル(32ビット浮動小数点)
- w = ワード(16ビット)
- l = long (32ビット整数または64ビット浮動小数点)
- q = quad (64ビット)
- t = 10バイト(80ビット浮動小数点)
サフィックスが指定されず、かつ命令に対するメモリ・オペランドが存在しない場合、GASは宛先レジスタ・オペランド(最終オペランド)のサイズからオペランド・サイズを推論します。
pushq $0x0
は 0 バイトを 8 個スタックにプッシュするだけです。そして
push %r9
は、次のように定義しています。
%r9
は64ビットレジスタで、その値はスタックにプッシュされます。
スタックについて興味深い事実は、スタックは下に成長するため、ヌルバイトのアドレスは
%r9
であるため、誤解が生じる可能性があります。
%r9
はヌルバイト以下です。
関連
-
[解決済み] usr/bin/env bash」と「#!/usr/bin/bash」の違いは何ですか?
-
[解決済み] "grep -q" のポイントは?
-
[解決済み] CHECK_NRPE: Error - SSLハンドシェイクを完了できませんでした。
-
[解決済み] カット」を使った最後のフィールドの探し方
-
[解決済み] bash: cd: そのようなファイルやディレクトリはありません
-
[解決済み] Linuxです。WGET -i オプションを使用したスキームが見つからない
-
[解決済み] Tarエラーです。アーカイブ内の予期しないEOF
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み】ノーアップとアンパサンドの違いについて
-
[解決済み】CLOCK_REALTIMEとCLOCK_MONOTONICの違い?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] gzip: stdin: not in gzip format tar: 子プロセスがステータス 1 を返しました。エラーは回復不可能:現在終了中
-
[解決済み】stdinがターミナルでないため、疑似ターミナルが割り当てられない
-
[解決済み】スラッシュとrsyncコマンド
-
[解決済み] Gccコンパイル "オブジェクトファイルのサフィックスを計算できない: コンパイルできない"
-
[解決済み] MongoDBへの接続が拒否された errno 111
-
[解決済み] readChar(con, 5L, useBytes = TRUE)でのエラー:接続を開くことができません。
-
[解決済み] LinuxでXcodeを動かせるか?
-
[解決済み] Nautilusのようにコマンドラインからマウントする方法とは?[クローズド]です。
-
[解決済み] CMakeエラーです。このプロジェクトでは次の変数が使用されていますが、NOTFOUND に設定されています。
-
[解決済み] x86アセンブリでレジスタに使用されるpush/pop命令の機能は何ですか?