Assembly 扩充精度运算

2018-10-27 09:59 更新
汇编语言同样提供允许你执行大于双字的数的加减法的指令。这些指令使用了进位标志位。就像上面规定的,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指令就没有区别了。这个在减法中也是一样的。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号