QWORD使用32位REG进行存储/实现。

时间:2011-10-23 10:11:32

标签: assembly x86

鉴于变量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

2 个答案:

答案 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

如果是抓取问题的进位部分,请考虑一个逐字节添加0x00FF0x1001的较小示例:

    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自身的剩余进位)。