由“mov”指令写的字符串

时间:2013-05-25 18:57:38

标签: assembly masm

我正在与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位变量中的。

任何建议表示赞赏。感谢

1 个答案:

答案 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 量的字节,而不是位