Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何将双寄存器mul结果存储到内存中_Assembly_X86_Intel - Fatal编程技术网

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定义的。)