2013-02-14 53 views
4

我想知道是否有可能(如果是,如何編寫)與push具有相同效果的指令序列。例如,如果ax的內容是1200,並且我做了push ax,那麼可以使用其他什麼指令來完成push ax所做的操作?執行與推動相同的操作的指令序列

回答

7

一些其他答案使用[sp]進行堆棧尋址,但在16位模式下以及在32位或64位模式下都不可行。但是,在32位模式下,您可以使用[esp],而在x86-64中,可以使用[rsp]進行內存尋址,但在16位模式下,不存在使用sp的內存尋址。有關16位模式下可能的存儲器尋址模式,請參見here

所以,你需要做的:存儲bp某處的值,複製spbp,然後用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到存儲器中,然後加載標誌爲ahlahf,然後從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修改AFCFOFPFSFZF,而lahf負載和sahf僅存儲AFCFPFSFZF(無OF)。但是,sp不應該在正常的堆棧使用情況下溢出。

但是,如果你不能訪問內存,並且想用棧來存儲bp你可以這樣做,但是如果你沒有使用自由寄存器,事情會變得複雜。但是,如果你使用的是實模式的操作系統,你可以阻止中斷與cli,交換bpsp,使用bp堆棧再次處理,交換bpsp,並再次允許中斷與sti

編輯:sp的值需要減去2以模擬push ax。固定。該版本不修改標誌(中斷標誌除外)。

cli 
xchg bp,sp 
lea bp,[bp-2] 
mov [bp],ax 
xchg bp,sp 
sti 
2

至少如果沒有記錯,這大致相當於:

sub sp, 2 
mov [sp], ax 
+0

沒有投票給你,但一個簡單的dec不會覆蓋上面寫的大小。你需要一個減法或類似的東西。 – 2013-02-14 18:08:53

+0

現在比較好,但'ax'是一個詞,所以'dec sp'兩次 – 2013-02-14 18:08:54

+0

@AntonKovalenko:好點。謝謝。 – 2013-02-14 18:09:18

1

減去等於從SP寫入所需的數據的大小的值,然後移動/寫堆棧上你想要的對象。編譯器一直在做這類事情。以-S輸出爲例。謹防原子/線程的問題,如果你這樣做......

+0

*哪些*原子/線程問題?我認爲你在發明它們。 – 2013-02-14 18:15:44

+0

在嵌入式系統上,您以非原子方式使用堆棧指針,並且事情變得繁榮。 「移動堆棧指針」,中斷,推送信息,返回,「寫入信息」,繁榮。 – 2013-02-14 18:30:49

+0

順便說一句,我已upvoted其他答案,因爲他們包括實際的示例代碼,而我懶惰,沒有:) – 2013-02-14 18:31:55

1

如果我沒有忘記Intel語法:

lea sp, [sp-2] 
mov [sp], ax 

我用lea避免觸及FLAGS(既不push也不movlea觸摸它們,但subdec)。

編輯:事實證明,我忘記了更重要的事情:沒有[sp]尋址模式。正確答案是@nrz的答案,我可以應用於80386及以上版本的espeax(將爲lea esp,[esp-4])。

+2

'mov [sp],ax'無效。 x86中沒有這樣的指令。 'esp'和'rsp'可以用於內存尋址,'sp'不能。看到我的答案。 – nrz 2013-02-14 18:40:58

相關問題