Assembly 扩充精度运算
汇编语言同样提供允许你执行大于双字的数的加减法的指令。这些指令使用了进位标志位。就像上面规定的,ADD 和SUB 指令在进位或借位产生时分别修改了进位标志位。储存在进位标志位里的信息可以用来做大的数字的加减法,通过将这些操作数分成小的双字(或更小) 块。
ADC 和SBB 指令使用了进位标志位里的信息。ADC指令执行下面的操作:
operand1 = operand1 + carry flag + operand2
SBB执行下面的操作:
operand1 = operand1 - carry flag - operand2
这些如何使用?考虑在EDX:EAX和EBX:ECX中的64位整形的总数。下面的代码将总数储存到EDX:EAX中:
1 add eax, ecx ; 低32位相加
2 adc edx, ebx ; 高32位带以前总数的进位相加
减法也是一样的。下面的代码用EDX:EAX减去EBX:ECX:
1 sub eax, ecx ; 低32位相减
2 sbb edx, ebx ; 高32位带借位相减
对于实际上大的数字,可以使用一个循环(看小节2.2)。对于一个求和的循环,对于每一次重复(替代所有的,除了第一次重复)使用ADC指令将会非常便利。通过在循环开始之前使用CLC (CLear Carry(清除进位))指令初始化进位标志位为0,可以使这个操作正确执行。如果进位标志位为0,那
么ADD和ADC指令就没有区别了。这个在减法中也是一样的。