我想知道是否有可能(如果是,如何編寫)與push
具有相同效果的指令序列。例如,如果ax
的內容是1200,並且我做了push ax
,那麼可以使用其他什麼指令來完成push ax
所做的操作?執行與推動相同的操作的指令序列
回答
一些其他答案使用[sp]
進行堆棧尋址,但在16位模式下以及在32位或64位模式下都不可行。但是,在32位模式下,您可以使用[esp]
,而在x86-64中,可以使用[rsp]
進行內存尋址,但在16位模式下,不存在使用sp
的內存尋址。有關16位模式下可能的存儲器尋址模式,請參見here。
所以,你需要做的:存儲bp
某處的值,複製sp
爲bp
,然後用bp
解決堆棧,並最終恢復bp
原始值。
如果你有一個地方來存儲bp
,很簡單(這是YASM/NASM語法):
mov [bp_storage], bp
sub sp,2
mov bp,sp
mov [bp],ax
mov bp,[bp_storage]
...
bp_storage dw 0
使用寄存器而不是內存地址一樣bp_storage
這裏是微不足道了。
編輯:增加的版本不修改標誌(下面),因爲push
也不修改標誌。
上面的代碼修改標誌,而push ax
不修改任何標誌。這可以通過存儲第一ah
到存儲器中,然後加載標誌爲ah
與lahf
,然後從ah
存儲所述標誌,以存儲器,然後修改如上堆疊,然後事後通過使用sahf
從存儲器經由ah
恢復標誌並最終恢復來解決ah
從內存中。
編輯:爲了模擬push ax
沒有標誌的變化,ah
必須lahf
之前被保存,mov [bp],ax
之前加載。固定。
mov [ah_storage],ah
lahf
mov [flags_storage],ah
mov [bp_storage],bp
sub sp,2
mov bp,sp
mov ah,[ah_storage]
mov [bp],ax
mov bp,[bp_storage]
mov ah,[flags_storage]
sahf
mov ah,[ah_storage]
...
bp_storage dw 0
ah_storage db 0
flags_storage db 0
sub
修改AF
,CF
,OF
,PF
,SF
,ZF
,而lahf
負載和sahf
僅存儲AF
,CF
,PF
,SF
,ZF
(無OF
)。但是,sp
不應該在正常的堆棧使用情況下溢出。
但是,如果你不能訪問內存,並且想用棧來存儲bp
你可以這樣做,但是如果你沒有使用自由寄存器,事情會變得複雜。但是,如果你使用的是實模式的操作系統,你可以阻止中斷與cli
,交換bp
和sp
,使用bp
堆棧再次處理,交換bp
和sp
,並再次允許中斷與sti
。
編輯:sp
的值需要減去2以模擬push ax
。固定。該版本不修改標誌(中斷標誌除外)。
cli
xchg bp,sp
lea bp,[bp-2]
mov [bp],ax
xchg bp,sp
sti
至少如果沒有記錯,這大致相當於:
sub sp, 2
mov [sp], ax
減去等於從SP寫入所需的數據的大小的值,然後移動/寫堆棧上你想要的對象。編譯器一直在做這類事情。以-S輸出爲例。謹防原子/線程的問題,如果你這樣做......
*哪些*原子/線程問題?我認爲你在發明它們。 – 2013-02-14 18:15:44
在嵌入式系統上,您以非原子方式使用堆棧指針,並且事情變得繁榮。 「移動堆棧指針」,中斷,推送信息,返回,「寫入信息」,繁榮。 – 2013-02-14 18:30:49
順便說一句,我已upvoted其他答案,因爲他們包括實際的示例代碼,而我懶惰,沒有:) – 2013-02-14 18:31:55
如果我沒有忘記Intel語法:
lea sp, [sp-2]
mov [sp], ax
我用lea
避免觸及FLAGS
(既不push
也不mov
或lea
觸摸它們,但sub
和dec
)。
編輯:事實證明,我忘記了更重要的事情:沒有[sp]
尋址模式。正確答案是@nrz的答案,我可以應用於80386及以上版本的esp
和eax
(將爲lea esp,[esp-4]
)。
'mov [sp],ax'無效。 x86中沒有這樣的指令。 'esp'和'rsp'可以用於內存尋址,'sp'不能。看到我的答案。 – nrz 2013-02-14 18:40:58
- 1. 區分相同操作碼的指令
- 2. 在Windows上的「git reset xxx」命令不會執行與linux相同的操作?
- 3. 如何讓jQuery執行與html表單相同的操作
- 4. 在java中執行與linux管道相同的操作?
- 5. unix命令執行與設置操作相當的列表比較
- 6. ActionScript - 兩個不同指令的相同操作碼?
- 7. 對相同的選項菜單項執行不同的操作
- 8. AngularJS - 與其自身狀態相同的指令中的更多相同指令
- 9. 多個PowerPC指令具有相同的操作碼
- 10. 「inc ecx」指令操作數必須是相同的大小?
- 11. 爲什麼這兩個指令具有相同的操作碼?
- 12. 線程同步執行操作順序
- 13. 與ARMv7相同的x86_64指令
- 14. SQL:在所有行上執行相同的操作
- 15. 無論承諾履行如何執行相同的操作?
- 16. 動作與動作指令中的avm指令
- 17. 如何將此curl命令轉換爲執行相同操作的Python代碼?
- 18. 流行的x64指令(操作碼+ RD)
- 19. 對for循環中的多個表執行相同的操作
- 20. 執行同步操作
- 21. 操作的列具有相同的值
- 22. 在多個文件上執行相同的操作
- 23. 這兩個CTE應該執行相同的操作嗎?
- 24. 對多個功能輸入執行相同的操作
- 25. 查詢幾個MongoDb集合並執行相同的操作
- 26. asp.net mvc - 使用多個URL來執行相同的操作
- 27. 綁定多個輸入執行相同的操作
- 28. 使用相同的參考對SQL結果執行操作
- 29. 防止多個用戶執行相同的操作
- 30. 如何處理onClick執行相同操作的許多按鈕?
沒有投票給你,但一個簡單的dec不會覆蓋上面寫的大小。你需要一個減法或類似的東西。 – 2013-02-14 18:08:53
現在比較好,但'ax'是一個詞,所以'dec sp'兩次 – 2013-02-14 18:08:54
@AntonKovalenko:好點。謝謝。 – 2013-02-14 18:09:18