簡體   English   中英

at&t匯編中'push'和'pushq'之間的區別是什么

[英]What's the difference between 'push' and 'pushq' in at&t assembly

我最近開始尋求更好地理解我的計算機是如何工作的。 我的問題是關於push和pushq之間的區別。

我知道push會將一個值寫入堆棧,我的假設是pushq做了類似的事情。 q在那里的事實讓我覺得應該有一個微妙的區別,但我似乎無法理解差異。

我說在使用命令'layout asm'使用gdb調試文件/ lib / udev / iphone-set-info時考慮這個問題。

有問題的代碼是:

pushq  $0x0
push   %r9

我知道$ 0x0對於NULL是十六進制的,而%r9是通用寄存器之一。 這只是意味着Null我們寫入堆棧,其上面寫有寄存器%r9嗎?

我不確定你使用的是哪種匯編語言,但對於使用AT&T語法的GAS(GNU匯編程序)來說也是如此:GAS匯編指令通常以字母“b”,“s”,“w”,“ l“,”q“或”t“確定操作的操作數大小。

  • b =字節(8位)
  • s =短(16位整數)或單(32位浮點)
  • w =字(16位)
  • l = long(32位整數或64位浮點)
  • q =四(64位)
  • t =十個字節(80位浮點)

如果未指定后綴,並且指令沒有存儲器操作數,則GAS根據目標寄存器操作數(最終操作數)的大小推斷操作數大小。

pushq $0x0只是將8個零字節推送到堆棧。 然后push %r9定義%r9是64位寄存器並將其值推送到堆棧。

關於堆棧增長的有趣事實,因此空字節將具有比%r9的值更高的地址,因此這可能是誤解,因為%r9實際值低於空字節。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM