我想知道是否有可能(如果是,如何編寫)與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. unix命令執行與設置操作相當的列表比較
- 2. ActionScript - 兩個不同指令的相同操作碼?
- 3. 對相同的選項菜單項執行不同的操作
- 4. 線程同步執行操作順序
- 5. 無論承諾履行如何執行相同的操作?
- 6. 動作與動作指令中的avm指令
- 7. 如何將此curl命令轉換爲執行相同操作的Python代碼?
- 8. 操作的列具有相同的值
- 9. 裝配錯誤:「指令操作數必須是相同大小」
- 10. 防止多個用戶執行相同的操作
- 11. 對多個功能輸入執行相同的操作
- 12. 如何處理onClick執行相同操作的許多按鈕?
- 13. 使用相同的參考對SQL結果執行操作
- 14. 專注於一個JTextField並執行與其相關的操作
- 15. 爲什麼我的DbProviderFactory與SqlClientFactory執行的操作不同?
- 16. jquery如何淡入工作?對animate()執行相同操作()
- 17. C:我如何使用與我的運行程序相同的命令行參數來執行()我的程序
- 18. 指令沒有執行到正確的順序與nodejs
- 19. 相同的指令與不同的消息 - angularJS
- 20. 執行表與BigQuery的命令列表
- 21. 如果元素的類與點擊元素的ID相同,請執行下列操作
- 22. 該segue沒有執行推動動作
- 23. 多個@Pattern的行爲與OR操作相同
- 24. 從不同的ViewModel執行相同的Prism命令
- 25. 執行相同的takePicture動作的多個按鈕Swift
- 26. 執行操作
- 27. 執行操作
- 28. 如何匹配字符串(一行)相同的模式,並執行相同的操作再次
- 29. 列表操作與序言
- 30. 選擇與另一列ID相同,但不同值的行和列指定值
沒有投票給你,但一個簡單的dec不會覆蓋上面寫的大小。你需要一個減法或類似的東西。 – 2013-02-14 18:08:53
現在比較好,但'ax'是一個詞,所以'dec sp'兩次 – 2013-02-14 18:08:54
@AntonKovalenko:好點。謝謝。 – 2013-02-14 18:09:18