鉴于变量I被定义为Qword,等式I = 2 * I可以使用以下最小指令来实现:
解决方案:
MOV EAX, DWORD PTR I
ADD DWORD PTR I, EAX
我得到的......
MOV EAX, DWORD PTR I+4
ADC DWORD PTR I+4, EAX
答案 0 :(得分:4)
X86是little endian架构。这意味着数字首先以最低有效字节存储。
作为示例0x1234
存储在内存中,首先是0x34
字节,然后是0x12
。维基百科的文章还有很多,但我会很快总结一下:
Memory location: X X+1
+------+------+
Content (byte) | 0x34 | 0x12 |
+------+------+
单词0x1234
是如何存储在内存中的。因此,如果访问内存位置X的最低有效字节,则最高有效字节存储在X + 1处。让我们看一下DWORD(0x12345678):
Memory location: Y Y+1 Y+2 Y+3
+------+------+------+------+
Content (byte) | 0x78 | 0x56 | 0x34 | 0x12 |
+------+------+------+------+
在此范围内,您可以访问各个字节(如上例所示)或者您可以访问内存位置Y(0x5678)和Y + 2(0x1234)的字。类似地,对于QWORD(0x0001020304050607):
Memory location: Z Z+1 Z+2 Z+3 Z+4 Z+5 Z+6 Z+7
+------+------+------+------+------+------+------+------+
Content (byte) | 0x07 | 0x06 | 0x05 | 0x04 | 0x03 | 0x02 | 0x01 | 0x00 |
+------+------+------+------+------+------+------+------+
因此,您可以将QWORD视为由2个DWORDS,4个字或8个字节组成。您可以看到第二个(最重要的)双字存储在Z + 4处。只要您记住首先存储最低有效字节/字/双字并且carry/borrow适当地存储,您也可以对这些表示中的任何一个进行算术运算。
所以:
MOV EAX, DWORD PTR I
ADD DWORD PTR I, EAX
将低4字节(一个DWORD)添加到自身(加倍)和进程集(如果适用)中的进位标志,它被添加到上部(同时它也被加倍):
MOV EAX, DWORD PTR I+4
ADC DWORD PTR I+4, EAX
如果是抓取问题的进位部分,请考虑一个逐字节添加0x00FF
和0x1001
的较小示例:
MOV AX, 0x00FF ; AL=0xFF AH=0x00
MOV BX, 0x1001 ; BL=0x01 AH=0x10
ADD AL, BL ; Add lower parts, the result is 0x100 which
; doesn't fit in 8 bits, i.e. AL=0x00 now and
; the carry flag is set
ADC AH, BH ; Add the most significant bytes together and
; include the carry flag. That is 0x00 + 0x10 + 1 = 0x11
; Final result AX = 0x1100
答案 1 :(得分:1)
在x86的说法中,WORD是16位,DWORD是32位,QWORD是64位。所以,一个QWORD由2个DWORDS组成,其中一个我们将其称为LOW DWORD(这一个用于较低的内存地址,因为x86是小端),另一个我们将引用为HIGH DWORD。 / p>
MOV EAX, DWORD PTR I
ADD DWORD PTR I, EAX
以上将LOW DWORD添加到自身。
MOV EAX, DWORD PTR I+4
ADC DWORD PTR I+4, EAX
以上将HIGH DWORD添加到自身,考虑到之前添加的剩余进位(LOW DWORD自身的剩余进位)。