Assembly 如何将双寄存器mul结果存储到内存中
假设我在Assembly 如何将双寄存器mul结果存储到内存中,assembly,x86,intel,Assembly,X86,Intel,假设我在dx:ax中得到了mul的结果,我如何将其保存到dword[ebx] 我对双字也有同样的问题:edx(高半部)和eax(低半部)指向[ebx]正如评论员Michael和Ped7g所说,您已经使用了偏移量。让我解释一下: x86以小端格式存储数字,这意味着最低顺序的字节首先存储在内存中。举个小例子:假设在eax中有值0x12345678,然后执行以下指令: mov [addr], eax …然后地址addr处的内存将如下所示: 78 56 34 12 mov [addr], eax
dx:ax
中得到了mul
的结果,我如何将其保存到dword[ebx]
我对双字也有同样的问题:edx(高半部)和eax(低半部)指向
[ebx]
正如评论员Michael和Ped7g所说,您已经使用了偏移量。让我解释一下:
x86以小端格式存储数字,这意味着最低顺序的字节首先存储在内存中。举个小例子:假设在eax
中有值0x12345678
,然后执行以下指令:
mov [addr], eax
…然后地址addr
处的内存将如下所示:
78 56 34 12
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
中有一个值,它是“在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
对于edx
和eax
中的64位值也是如此,偏移量为4
。假设您在edx
和eax
中将值0x1234567890ABCDEF
拆分为0x12345678
,那么它将如下所示:
78 56 34 12
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
正如评论员Michael和Ped7g所说,您已经使用了偏移量。让我解释一下: x86以小端格式存储数字,这意味着最低顺序的字节首先存储在内存中。举个小例子:假设在
eax
中有值0x12345678
,然后执行以下指令:
mov [addr], eax
…然后地址addr
处的内存将如下所示:
78 56 34 12
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
中有一个值,它是“在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
对于edx
和eax
中的64位值也是如此,偏移量为4
。假设您在edx
和eax
中将值0x1234567890ABCDEF
拆分为0x12345678
,那么它将如下所示:
78 56 34 12
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
使用两个
mov
s:mov[ebx],ax
/mov[ebx+2],dx
这应该是一个答案。那么eax和edx呢+4?是的,mov[ebx],eax
将把32位(eax=32b寄存器)(=4字节)存储到内存中,因此如果您希望edx值紧随其后,您可以使用[ebx+4]来寻址以下4个字节。请记住,您必须让ebx指向某个内存,其中保留了此大小(8字节),否则您将覆盖其他内容。使用两个mov
s:mov[ebx],ax
/mov[ebx+2],dx
这应该是一个答案。那么eax和edx呢+4?是的,mov[ebx],eax
将把32位(eax=32b寄存器)(=4字节)存储到内存中,因此如果您希望edx值紧随其后,您可以使用[ebx+4]来寻址以下4个字节。请记住,您必须让ebx指向某个内存,其中保留了此大小(8字节),否则您将覆盖其他内容。(MASM/TASM需要mov dword ptr[addr],eax
如果addr
是用dq
qword定义的。)(MASM/TASM需要mov dword ptr[addr],eax
如果addr
是用dq
qword定义的。)