2012-08-17 40 views
3

我想問如何在16位程序集中模擬C指針。以16位模式加載地址

int var = 10; 
int * ptr = &var; 

在組裝它就像

mov dword ptr [ebp-x], 10 
lea eax, dword ptr [ebp-x] 
mov dword ptr [ebp-x+4], eax 

有什麼辦法如何在16裝配得到[bp-x]變量的物理地址。 例如: 我有從軟盤讀取扇區的程序,然後跳轉到segment:0並執行它。 正在加載的程序是簡單的文本編輯器。在編輯器中,我需要獲取單個變量的物理地址,將其轉換爲segment:offset並將其用於加載文本文件。我試圖設置DS:SI之前跳到exitor,但它不是很好的解決方案。有誰知道如何解決它?請幫忙。

+1

C指針沒有什麼特別之處......你的意思是模擬比16位更大範圍的指針嗎? – 2012-08-17 11:30:13

回答

1

因此,這是你的要求: -

mov word ptr [bp-x], 10 
lea ax, word ptr [bp-x] 
mov word ptr [bp-x+4], ax 

你可以使用一些舊的編譯器,可能是美麗的TCC(Turbo C的編譯器,16位)。 而那會輸出你所需要的。

此外,即使你會看到一個16位指針,它的只是虛擬的,它的實際地址將按照架構進行轉換(就像32位操作系統在64位體系結構上以兼容模式運行一樣)。

但是,如果你對這些東西真的很感興趣,只需打開cmddebuga→然後你可以在那裏寫一些裝配。

+0

我應該將它加載到eax還是ax?它是字ptr ... – user35443 2012-08-17 11:34:31

+0

ax是一個字的大小......明顯地它足以存儲實模式地址。 – perilbrain 2012-08-17 11:36:39

+0

確定這樣lea在真實模式下工作.. – user35443 2012-08-17 14:23:48

2

在實際尋址模式下,一個字節內存的物理地址等於段* 16 +偏移量。

當您通過[(e)bp+...][esp+...]引用內存時,涉及的默認段是ss。否則它是ds。可選的段覆蓋前綴將更改默認的段寄存器。

因此,舉例來說,如果你的變量爲[bp-8]解決,那麼它的物理地址是ss*16+bp-8