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