所以,假设我在mul
中得到了dx:ax
的结果,如何将其保存到dword [ebx]
??
我对双字有同样的问题:edx(高半)和eax(低半)到[ebx]
指向的两个双字。
答案 0 :(得分:2)
正如评论者迈克尔和Ped7g已经说的那样,你有使用补偿。让我解释一下:
x86以little-endian格式存储数字,这意味着最低位字节首先存储在内存中。一个小例子:假设0x12345678
中有值eax
,并执行此指令:
mov [addr], eax
...然后地址addr
的内存将如下所示:
78 56 34 12
在您的示例中,您有dx:ax
中的值,这是“dx
中值为高16位且ax
中低16位”的简写。假设该值再次为0x12345678
,那么0x1234
中的dx
和0x5678
中的ax
,则需要两个移动指令:
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
中的值0x12345678
拆分为edx
中的0x90ABCDEF
和eax
中的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
,那么它将如下所示:
items = {
Load: 0,
Unit: 0,
object: {
Property: "prop"
}