codecamp

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指令就没有区别了。这个在减法中也是一样的。

Assembly 补码运算
Assembly 控制结构
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }