16位寄存器作为偏移的有效地址计算

时间:2012-12-31 00:43:03

标签: assembly nasm intel-syntax

使用以下代码,我尝试"存储"两个较高字节中的ebx的低两个字节,然后使用低阶bx作为临时变量来访问" pool"的偏移量。最后,我通过右移数据来恢复原始值(它只使用了最初的两个字节)。

rol ebx, 16

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

shr ebx, 16

这与nasm组合得很好,但是我得到了错误

  

重定位被截断以适合:R_386_16与`.data'

链接时

有关如何绕过此错误的任何建议?简单地使用另一个寄存器不是一个选项,因为字面上每个寄存器保存esp和段寄存器正在被使用。

编辑:我假设有人会问,所以我使用32位汇编

2 个答案:

答案 0 :(得分:2)

因为您在有效地址中使用了bx,所以汇编程序认为您需要一个16位地址,因此生成了16位重定位,链接器对此不满意。无论如何,它可能无法在32位模式下工作,因为您的变量不太可能位于地址空间的底部64k。

如果您没有任何免费注册,也许可以使用堆栈:

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

你说只使用了低{16}的ebx。如果edx也是如此,您可以将dx保存在ebx的前16位,例如:

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

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

答案 1 :(得分:0)

使用和movzx ebx,bx截断bx然后将其用作表mov [pool + ebx]的索引,esi:)