Assembly 使用32位REGs存储/实现QWORD。?

Assembly 使用32位REGs存储/实现QWORD。?,assembly,x86,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 X86是一种体系结构。这意味着数字首先以最低有效字节存储 例如,0x1234以0x34字节后跟0x12存储在内存中。维基百科的文章还有很多,但我会很快总结: Memory location: X X+

假设变量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
X86是一种体系结构。这意味着数字首先以最低有效字节存储

例如,
0x1234
0x34
字节后跟
0x12
存储在内存中。维基百科的文章还有很多,但我会很快总结:

Memory location:       X      X+1
                    +------+------+
Content (byte)      | 0x34 | 0x12 |
                    +------+------+
是单词
0x1234
在内存中的存储方式。因此,如果访问内存位置X的最低有效字节,最高有效字节存储在X+1。让我们看一个DWORD(0x12345678):

在此范围内,您可以访问单个字节(如上例所示),也可以访问内存位置Y(0x5678)和Y+2(0x1234)处的字。类似于QWORD(0x0001020304050607):

因此,您可以将QWORD看作是由2个DWORD、4个字或8个字节组成的。您可以看到,第二个(最重要的)dword存储在Z+4处。您还可以对这两种表示法中的任何一种进行算术运算,只要您记住最低有效字节/字/DWORD是先存储的,并且是适当的

因此:

将较低的4个字节(一个DWORD)添加到自身(将其加倍),并在进程集(如果适用)中添加进位标志,进位标志是添加到上部的(同时也将其加倍):

如果是您难以掌握的进位部分,请考虑将此代码添加一个字节:<代码> > 0x0FF< <代码> > <代码> 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
X86是一种体系结构。这意味着数字首先以最低有效字节存储

例如,
0x1234
0x34
字节后跟
0x12
存储在内存中。维基百科的文章还有很多,但我会很快总结:

Memory location:       X      X+1
                    +------+------+
Content (byte)      | 0x34 | 0x12 |
                    +------+------+
是单词
0x1234
在内存中的存储方式。因此,如果访问内存位置X的最低有效字节,最高有效字节存储在X+1。让我们看一个DWORD(0x12345678):

在此范围内,您可以访问单个字节(如上例所示),也可以访问内存位置Y(0x5678)和Y+2(0x1234)处的字。类似于QWORD(0x0001020304050607):

因此,您可以将QWORD看作是由2个DWORD、4个字或8个字节组成的。您可以看到,第二个(最重要的)dword存储在Z+4处。您还可以对这两种表示法中的任何一种进行算术运算,只要您记住最低有效字节/字/DWORD是先存储的,并且是适当的

因此:

将较低的4个字节(一个DWORD)添加到自身(将其加倍),并在进程集(如果适用)中添加进位标志,进位标志是添加到上部的(同时也将其加倍):

如果是您难以掌握的进位部分,请考虑将此代码添加一个字节:<代码> > 0x0FF< <代码> > <代码> 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

用x86的说法,一个字是16位,一个DWORD是32位,一个QWORD是64位。因此,一个QWORD由两个DWORD组成,其中一个我们称为低DWORD(这一个指向较低的内存地址,因为x86是小端),另一个我们称为高DWORD

MOV EAX, DWORD PTR I
ADD DWORD PTR I, EAX
上面添加了低位DWORD

MOV EAX, DWORD PTR I+4
ADC DWORD PTR I+4, EAX

上面将高位DWORD添加到自身,同时考虑到上一次添加的任何剩余进位(低位DWORD添加到自身)。

用x86的说法,一个字是16位,一个DWORD是32位,一个QWORD是64位。因此,一个QWORD由两个DWORD组成,其中一个我们称为低DWORD(这一个指向较低的内存地址,因为x86是小端),另一个我们称为高DWORD

MOV EAX, DWORD PTR I
ADD DWORD PTR I, EAX
上面添加了低位DWORD

MOV EAX, DWORD PTR I+4
ADC DWORD PTR I+4, EAX

上面将高双字添加到自身中,考虑到上一次添加的任何剩余进位(低双字添加到自身中)。

第二部分请。。。我不明白第二部分:(!!,
I+4
部分?这是qword中最重要的dword部分。我可以详细说明这是否是混淆的地方。为什么我要在我的答案中添加进位标志,为什么我要在Q中添加4?是的,正是解决了qword的上半部分。更新并添加了一些维基百科文章的相关链接。他们可能请把它解释得比我好。第二部分请…我不明白第二部分:(!!,
I+4
部分?这是qword中最重要的dword部分。我可以详细说明这是否是混淆的地方。为什么我要在我的答案中添加进位标志,为什么我要在Q中添加4?是的,正是解决了qword的上半部分。更新并添加了一些维基百科文章的相关链接。他们可能布莱比我解释得更清楚。