使用单词

时间:2012-10-17 22:58:57

标签: assembly masm32

我正在学习并正在学习使用QWORD的汇编程序转换(x86-32bit)。现在我的参考资料没有任何关于使用这些值的东西,除了明显将它们分成32位寄存器之外。我猜他们是旧的。较新的处理器具有mmx和sse指令等。我是否会很好地研究解决这个问题的指示?处理QWORD值的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

使用64位整数可能容易,也可能不容易;取决于您想要执行的操作类型。

对于布尔运算(AND,OR,XOT,NOT),只需将其拆分就可以轻松处理任意长度的整数。

对于加法和减法,通过将ADC(Add With Carry)或SBB(借用减去)指令链接在一起,很容易支持任意长度的整数。例如(128位):

add eax,[value]
adc ebx,[value+4]
adc ecx,[value+8]
adc edx,[value+12]  ;edx:ecx:ebx:eax = 128-bit result of addition

否定只是减法(-x = 0 - x)。

对于向左/向右移动,通过将SHLDSHRD指令链接在一起,可以轻松支持任意长度的整数。例如(128位):

shld edx,ecx,12
shld ecx,ebx,12
shld ebx,eax,12
shl eax,12          ;edx:ecx:ebx:eax = 128-bit result of shift left by 12

如果移位计数太大(例如,您想要向左移动44位),则需要先移动数据然后再移动“原始计数MOD 32”。例如:

mov edx,ecx
mov ebx,ebx
mov ebx,eax
mov eax,0          ;edx:ecx:ebx:eax = original value shifted left by 32
shld edx,ecx,12
shld ecx,ebx,12
shld ebx,eax,12
shl eax,12         ;edx:ecx:ebx:eax = original value shifted left by 44

对于乘法,CPU支持“32位* 32位= 64位结果”。对于任何更大的值,您可以将任何宽度整数与任何宽度整数相乘。这类似于使用base10手动乘以大数字的方式(其中每个数字是从0到9的值),除了你使用base4294967296(其中每个数字是32位整数)。例如,对于使用base10的多个34乘58,你可以:

result_digit0to1 = 4*8 = 32
result_digit1to2a = 4*5 = 20
result_digit1to2b = 3*8 = 24
result_digit2to3 = 3*5 = 15
result = result_digit0to1 + (result_digit1to2 + result_digit1to2) * 10 + result_digit2to3 * 100;
result = 32 + (20 + 24) * 10 + 15 * 100
result = 32 + 440 + 1500
result = 1972

基本上,一个数字中的每个数字乘以另一个数字中的每个数字,同时跟踪数字的位置/幅度;结果是中间结果的总和。

对于“64位* 64位= 128 =位结果”,您可以执行以下操作:

result_bits0to63 = first_bits0to31 * second_bits0to31;
result_bits32to95a = first_bits32to64 * second_bits0to31;
result_bits32to95b = first_bits0to31 * second_bits32to64;
result_bits64to128 = first_bits32to64 * second_bits32to64;
result = result_bits0to63 + ( (result_bits32to95a + result_bits32to95b) << 32) + (result_bits64to128 << 64)

但是,这仅适用于无符号整数。对于有符号整数,您需要删除符号位并进行无符号乘法,然后在结果中设置符号(result_sign_bit = first_sign_bit XOR second_sign_bit)。

对于师,你最终做“base2 long division”。您可以将除数移到最左侧,而不会丢失最高设置位(同时跟踪“位移”)。然后将它一次一位地移回原位,同时将其与被分割的值进行比较。如果移位的除数小于被除数的值,则从被除法的值中减去移位的除数,并在结果中设置相应的位。在除数返回到原始位置后,被分割的值变为余数。

与乘法一样,除法只适用于无符号整数,你需要预先删除符号位,然后执行无符号除法,然后设置符号(在结果和余数中)。

如果你了解所有这一切;然后你就可以(例如)用64位CPU做512位数学运算,或者用16位CPU做65536位数学运算,或者在任何CPU上做“任何宽度”数学运算。

答案 1 :(得分:0)

最佳方法是使用与QWORD一起使用的说明,除非课程明确禁止这样做。然后,您必须使用32位寄存器来完成工作。您可以编写一些子程序来使用QWORD执行基本逻辑指令。