2012-12-31 130 views
1

使用下面的代碼,我嘗試在兩個較高字節中「存儲」ebx的較低兩個字節,然後使用較低順序的bx作爲臨時變量來訪問偏移量「池子」。最後,我通過右移數據來恢復原始值(它只使用最初的兩個字節)。使用16位寄存器進行有效地址計算作爲偏移

rol ebx, 16 

mov bl, dl 
;(other operations involving bx)  
mov [pool+bx], dword esi 

shr ebx, 16 

該彙編只是NASM正常,但是我得到的錯誤

搬遷截斷以適應:R_386_16反對'。數據」

鏈接時。有關如何繞過此錯誤的任何建議?簡單地使用另一個寄存器不是一個選項,因爲從字面上看,每個寄存器保存esp並且正在使用段寄存器。

編輯:我認爲有人會問,所以我使用的是32位彙編

回答

2

因爲在有效地址中使用了bx,所以彙編程序認爲您需要16位地址,因此會生成連接器不滿意的16位重定位。無論如何,它可能無法在32位模式下工作,因爲您的變量不太可能位於地址空間的底部64k。

如果你沒有任何的自由寄存器也許你可以使用堆棧:

push ebx 
mov bl, dl 
;(other operations involving bx) 
movzx ebx, bx 
mov [pool+ebx], esi 
pop ebx 

你說只使用的ebx低16位。如果這對edx的情況下,你可以在ebx前16位,如保存dx

shl ebx, 16 
mov bx, dx 
;(other operations involving dx) 
movzx edx, dx 
mov [pool+edx], esi 
mov dx, bx 
shr ebx, 16 

不,你不能在段寄存器保存任意值。

0

截斷BX與和MOVZX EBX,BX然後用它作爲索引表中MOV [池+ EBX],ESI: )

+0

不幸的是,我需要保留數據移動到ebx的上部兩個字節,所以截斷不會真的起作用。任何想法,如果我可以卸載池的偏移到未使用的段寄存器? – Precursor