2012-10-23 54 views
1

我正在編寫一個windows 32位程序,該程序在行內彙編中有一些部分。該程序旨在運行在32位和64位系統。我正在編譯這兩個系統的32位版本。32位Windows嵌入式程序中的堆棧寬度

我的問題是,我假設堆棧寬度是4個字節寬。當我的32位程序在64位Windows系統下運行時,堆棧寬度仍然是4字節寬?

在我的計劃,我(這是簡化版本)我推棧中的某個值:

for (i=0;i<4;i++) 
    { 
    _asm 
     { 
     mov ebx,i ; push 0,1,2,3 on the stack 
     push ebx 
     } 
    } 

後來我回用這樣的代碼quering值:

ii=0; 
for (i=0;i<5;i++) 
    { 
    _asm 
     { 
     mov ebx,ii ; ii has 0, then 4, then 8 ... 
     mov eax,dword ptr [esp+ebx]  ; peek values on the stack from the top 
     mov num1,eax 
     } 
    ii+=4; // here I am assuming stack width is 4 bytes 
    // -- do something with num1 --// 
    } 
+0

請定義「堆棧寬度」。 –

回答

1

假設64位系統提供了一種向後兼容32位二進制文​​件的機制,那麼堆棧仍然是32位寬。

Windows x64系統就是其中之一。

1

無論如何,堆棧並沒有真正的「寬度」。這只是字節。堆棧指針有時需要對齊,但堆棧本身只是字節。您可以以任何您想要的方式使用該空間。您可以手動操作rSP,並將其與您想要的嚴重對齊(這可能會導致麻煩,但您仍然可以可以)。您可以在任何偏移處直接從/向堆棧讀/寫數據,甚至可以在堆棧指針之外進行讀寫操作。

本質上,沒有規則,只有系統其餘部分的假設。如果你的代碼不能滿足這些假設,事情可能會出錯,但是沒有什麼會阻止你從堆棧指針中減去三個,然後在剛創建的空間中寫入5個字節(顯然它們不會全部適合)。

但你實際上似乎要問的是:確實push r32推兼容模式下的雙字?

是的,它的確如此。事實上,它總是在任何情況下都會發生,否則它將無法組裝。你不能寫push r32和「意外」推qword - push r32不能編碼爲64位模式。

該行爲不取決於操作系統。

此外,您仍然可以在正常32位模式,兼容模式和64位模式下推送和彈出單詞。而且,就像我之前說過的,您可以繼續前進,並使用堆棧指針進行操作。

相關問題