web-dev-qa-db-ja.com

at&tアセンブリの「Push」と「pushq」の違いは何ですか

私は最近、自分のコンピューターがどのように機能するかについて理解を深めるための探求を始めました。私の質問は、Pushとpushqの違いについてです。

Pushがスタックに値を書き込むことを知っています。私の想定は、pushqが同様のことを行うということです。 qが存在するという事実から、微妙な違いがあるはずだと思いますが、違いを理解することができないようです。

「layout asm」コマンドでgdbを使用してファイル/ lib/udev/iphone-set-infoをデバッグしているときに、この質問を熟考するように述べました。

問題のコードは:

pushq  $0x0
Push   %r9

$ 0x0はNULLの16進数であり、%r9は汎用レジスターの1つであることを理解しています。これは単に、その上にレジスタ%r9が書き込まれたスタックにNullが書き込まれたことを意味しますか?

10
user6090272

使用しているアセンブリ言語はわかりませんが、AT&T構文を使用するGAS(GNU Assembler)にも当てはまります。GASアセンブリの命令には、通常「b」、「s」、「w」、「 l "、" q "、または" t "は、操作するオペランドのサイズを決定します。

  • b =バイト(8ビット)
  • s = short(16ビット整数)またはsingle(32ビット浮動小数点)
  • w =ワード(16ビット)
  • l = long(32ビット整数または64ビット浮動小数点)
  • q =クワッド(64ビット)
  • t = 10バイト(80ビット浮動小数点)

サフィックスが指定されておらず、命令のメモリオペランドがない場合、GASはデスティネーションレジスタオペランド(最後のオペランド)のサイズからオペランドサイズを推測します。

pushq $0x0は、8バイトの0バイトをスタックにプッシュするだけです。次に、Push %r9は、%r9が64ビットレジスタであることを定義し、その値をスタックにプッシュします。

スタックが大きくなるという興味深い事実です。そのため、nullバイトのアドレスは%r9の値よりも高くなるため、実際の%r9の値はnullバイトよりも小さいため、誤解を招く可能性があります。

6
Keltar Helviett