使用以下代码,我尝试"存储"两个较高字节中的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位汇编
答案 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:)