【问题标题】:How to store a two-register mul result into memory如何将两个寄存器的 mul 结果存储到内存中
【发布时间】:2016-05-16 09:03:56
【问题描述】:

假设我在dx:ax 中得到了mul 的结果,如何将其保存到dword [ebx]??

我对双字也有同样的问题:edx(高半)和 eax(低半)指向[ebx] 指向的两个双字。

【问题讨论】:

  • 使用两个movs:mov [ebx], ax/mov [ebx+2], dx
  • 这应该是一个答案。
  • 那么 eax 和 edx 呢? +4 ?
  • 是的,mov [ebx],eax 会将 32 位(eax = 32b 寄存器)(= 4 字节)存储到内存中,所以如果你想在它之后有 edx 值,你可以使用 [ebx+ 4]来解决以下4个字节。请记住,您必须让 ebx 指向一些内存,并在其中保留此大小(8 字节),否则您将覆盖其他内容。

标签: assembly x86 intel


【解决方案1】:

正如评论者 Michael 和 Ped7g 已经说过的,您已经使用了偏移量。让我解释一下:

x86 以 little-endian 格式存储数字,这意味着最低位字节首先存储在内存中。一个小例子:假设你在eax中有值0x12345678,并且你执行这条指令:

mov [addr], eax

...那么地址addr的内存将如下所示:

78 56 34 12

在您的示例中,您在 dx:ax 中有一个值,它是“在dx 中具有值的高 16 位,在 ax 中具有低 16 位”的简写。再次假设值是0x12345678,那么您在dx 中有0x1234,在ax 中有0x5678,那么您需要两个移动指令:

mov [addr], ax   // Memory now looks like this: 78 56
mov [addr+2], dx // Memory now looks like this: 78 56 34 12

+2 来自于ax 是一个 16 位寄存器,即它存储在内存中时会占用两个字节,所以既然你想把dx 放在它后面,你需要增加2的地址。

edxeax 中的 64 位值相同,偏移量为 4。假设您将值0x1234567890ABCDEF 拆分为edx 中的0x12345678eax 中的0x90ABCDEF,那么它看起来像这样:

mov [addr], eax   // Memory now looks like this: EF CD AB 90
mov [addr+4], edx // Memory now looks like this: EF CD AB 90 78 56 34 12

【讨论】:

  • (如果addr 是用dq qword 定义的,则MASM/TASM 将需要mov dword ptr [addr], eax。)
猜你喜欢
  • 2021-01-23
  • 2011-01-14
  • 2016-01-18
  • 1970-01-01
  • 2015-06-23
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多