2013-05-25 45 views
2

我正在使用MASM。通过“mov”指令编写的字符串

我有一个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位变量中的内容。

任何意见表示赞赏。由于

回答

4

我不太清楚你想要做的事情,但是这可能是你要去哪里错了:

mov ebx, OFFSET num1+32 

你在做什么在这里越来越的num1地址+ 32 字节,恰好在您的一个字符串中间。我猜你认为这样做得到的地址是num1 + 32位。

这会的num1较低部分的地址进入ebx

mov ebx, OFFSET num1+4 

正如你所看到的,我用4个字节,这相当于32位,这是抵消NUM1我相信你想要。

如果这是解释不清,这可能是,这里有一个简单的消息:

考虑:mov (register), (base) + (offset)

你把什么偏移将是字节的X量,不位

+0

非常感谢,先生!那正是我所期待的。我完全忘记了DWORD以字节移动而不是(偏移量)的位。 – user2420929

+0

@ user2420929乐于助人。 – Aaron