2012-12-31 74 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