Assembly 擴(kuò)充精度運(yùn)算

2018-10-27 09:59 更新
匯編語(yǔ)言同樣提供允許你執(zhí)行大于雙字的數(shù)的加減法的指令。這些指令使用了進(jìn)位標(biāo)志位。就像上面規(guī)定的,ADD 和SUB 指令在進(jìn)位或借位產(chǎn)生時(shí)分別修改了進(jìn)位標(biāo)志位。儲(chǔ)存在進(jìn)位標(biāo)志位里的信息可以用來(lái)做大的數(shù)字的加減法,通過(guò)將這些操作數(shù)分成小的雙字(或更小) 塊。


擴(kuò)充精度運(yùn)算


ADC 和SBB 指令使用了進(jìn)位標(biāo)志位里的信息。ADC指令執(zhí)行下面的操作:


operand1 = operand1 + carry flag + operand2


SBB執(zhí)行下面的操作:


operand1 = operand1 - carry flag - operand2


這些如何使用?考慮在EDX:EAX和EBX:ECX中的64位整形的總數(shù)。下面的代碼將總數(shù)儲(chǔ)存到EDX:EAX中:


1       add       eax, ecx      ; 低32位相加
2       adc       edx, ebx      ; 高32位帶以前總數(shù)的進(jìn)位相加


減法也是一樣的。下面的代碼用EDX:EAX減去EBX:ECX:


1       sub       eax, ecx ;     低32位相減
2       sbb       edx, ebx ;     高32位帶借位相減


對(duì)于實(shí)際上大的數(shù)字,可以使用一個(gè)循環(huán)(看小節(jié)2.2)。對(duì)于一個(gè)求和的循環(huán),對(duì)于每一次重復(fù)(替代所有的,除了第一次重復(fù))使用ADC指令將會(huì)非常便利。通過(guò)在循環(huán)開(kāi)始之前使用CLC (CLear Carry(清除進(jìn)位))指令初始化進(jìn)位標(biāo)志位為0,可以使這個(gè)操作正確執(zhí)行。如果進(jìn)位標(biāo)志位為0,那
么ADD和ADC指令就沒(méi)有區(qū)別了。這個(gè)在減法中也是一樣的。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)