我正在与MASM合作。
我有一个64位变量,我需要将一个32位输入从寄存器存储到64位变量的下半部分。
首先,我将下半部分的地址移到寄存器中:
mov ebx, OFFSET num1+32
然后,我使用PTR
指令将32位输入存储到变量的后半部分:
mov DWORD PTR [ebx], eax
但是,每次第二行运行时,我在“.data”中声明的一个字符串都会被覆盖在内存中。它来自:
45 6e 74 65 72 20 46 69 72 73 74 20 48 61 6c 66 20 6f 66 20
到
45 6e 74 65 72 20 46 69 bb bb bb bb 48 61 6c 66 20 6f 66 20
如上所示,更改的内容为bb bb bb bb
。
我输入的bb bb bb bb
是在运行上面两行之前存储在64位变量中的。
任何建议表示赞赏。感谢
答案 0 :(得分:4)
我不太确定你要做什么,但这可能是你出错的地方:
mov ebx, OFFSET num1+32
你在这里做的是获取num1
+ 32 字节的地址,这恰好位于你的一个字符串的中间。我猜你认为这样做的是num1
+ 32位的地址。
这会将num1
下半部分的地址移至ebx
:
mov ebx, OFFSET num1+4
正如你所看到的,我将num1偏移4个字节,相当于32位,这就是我认为你想要的。
如果解释得很糟糕,可能是这样,这是一条简化的信息:
鉴于:mov (register), (base) + (offset)
放入偏移量的是 x 量的字节,而不是位。