0
我正在寫32位x86彙編程序,我不太清楚如何解決始終與代碼具有相同關係的數據。我是否必須使用EIP來計算絕對地址,還是有更好的方法?使用相對指針尋址數據(x86-32彙編程序)
我正在寫32位x86彙編程序,我不太清楚如何解決始終與代碼具有相同關係的數據。我是否必須使用EIP來計算絕對地址,還是有更好的方法?使用相對指針尋址數據(x86-32彙編程序)
取決於操作系統。通常有段寄存器DS(數據段)和CS(代碼段)不同的值。 所以,你可以使用CS前綴,如:
mov edx, cs:[eax]
在這種情況下,默認的前綴是DS段寄存器。
您可以使用位置無關的代碼:
call @f
dd 42 ; data
@@:
pop eax ; eax contains offset of data
mov eax, cs:[eax]
或
call base
base:
pop ebp
sub ebp, base ; to use small offsets, -128 to +127, and smaller instruction size
;....
mov eax, cs:[ebp+dataN-base] ; dataN-base is called "delta-offset"
;....
data1:
dd 100
;....
dataN:
dd 200
我沒有使用OS使用相同的與delta-偏移。我處於保護模式,所以有段描述符,而不是實際的段號。在我的情況下,只有兩個段描述符,數據和代碼(不包括空值)。 – 2010-09-13 20:34:58