如何将两个寄存器的 mul 结果存储到内存中
How to store a two-register mul result into memory
假设我在 dx:ax
中得到了 mul
的结果,我如何将它保存到 dword [ebx]
?
我对双字有同样的问题:edx(高半)和 eax(低半)到 [ebx]
指向的两个双字。
正如评论者 Michael 和 Ped7g 所说,您已经使用了偏移量。让我解释一下:
x86 以小端格式存储数字,这意味着最低位的字节首先存储在内存中。一个小例子:假设你在 eax
中有值 0x12345678
,你执行这条指令:
mov [addr], eax
...那么地址 addr
的内存将如下所示:
78 56 34 12
在您的示例中,您在 dx:ax
中有一个值,它是 "have a value's upper 16 bits in dx
and its lower 16 bits in ax
" 的 shorthand。再次假设该值是 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
.
edx
和 eax
中的 64 位值相同,偏移量为 4
。假设您将值 0x1234567890ABCDEF
拆分为 edx
中的 0x12345678
和 eax
中的 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
假设我在 dx:ax
中得到了 mul
的结果,我如何将它保存到 dword [ebx]
?
我对双字有同样的问题:edx(高半)和 eax(低半)到 [ebx]
指向的两个双字。
正如评论者 Michael 和 Ped7g 所说,您已经使用了偏移量。让我解释一下:
x86 以小端格式存储数字,这意味着最低位的字节首先存储在内存中。一个小例子:假设你在 eax
中有值 0x12345678
,你执行这条指令:
mov [addr], eax
...那么地址 addr
的内存将如下所示:
78 56 34 12
在您的示例中,您在 dx:ax
中有一个值,它是 "have a value's upper 16 bits in dx
and its lower 16 bits in ax
" 的 shorthand。再次假设该值是 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
.
edx
和 eax
中的 64 位值相同,偏移量为 4
。假设您将值 0x1234567890ABCDEF
拆分为 edx
中的 0x12345678
和 eax
中的 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