[英]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“確定操作的操作數大小。
如果未指定后綴,並且指令沒有存儲器操作數,則GAS根據目標寄存器操作數(最終操作數)的大小推斷操作數大小。
pushq $0x0
只是將8個零字節推送到堆棧。 然后push %r9
定義%r9
是64位寄存器並將其值推送到堆棧。
關於堆棧增長的有趣事實,因此空字節將具有比%r9
的值更高的地址,因此這可能是誤解,因為%r9
實際值低於空字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.