Assembly 使用32位REGs存储/实现QWORD。?
假设变量I被定义为Qword,则方程I=2*I可使用以下最低指令实现: 解决方案: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+
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的上半部分。更新并添加了一些维基百科文章的相关链接。他们可能布莱比我解释得更清楚。