Команды ADC (сложение с учетом переноса) и SBB (вычитание с учетом займа) специально были введены для подобных операций. При сложении сначала складывают самые младшие байты, слова или двойные слова командой ADD, а затем складывают все остальное командами ADC, двигаясь от младшего конца числа к старшему. Команды SUB/SBB действуют полностью аналогично.
bigval_1 dw 0,0,0 ; 96-битное число bigval_2 dw 0,0,0 bigval_3 dw 0,0,0
; сложение 96-битных чисел bigval_1 и bigval_2 mov eax,dword ptr bigval_1 add eax,dword ptr bigval_2 ; сложить младшие слова mov dword ptr bigval_3,eax mov eax,dword ptr bigval_1[4] adc eax,dword ptr bigval_2[4] ; сложить средние слова mov dword ptr bigval_3[4],eax mov eax,dword ptr bigval_1[8] adc eax,dword ptr bigval_2[8] ; сложить старшие слова mov dword ptr bigval_3[8],eax
; вычитание 96-битных чисел bigval_1 и bigval_2 mov eax,dword ptr bigval_1 sub eax,dword ptr bigval_2 ; вычесть младшие слова mov dword ptr bigval_3,eax mov eax,dword ptr bigval_1[4] sbb eax,dword ptr bigval_2[4] ; вычесть средние слова mov dword ptr bigval_3[4],eax mov eax,dword ptr bigval_1[8] sbb eax,dword ptr bigval_2[8] ; вычесть старшие слова mov dword ptr bigval_3[8],eax
Сложение и вычитание для чисел с фиксированной запятой ничем не отличается от сложения и вычитания целых чисел:
mov ax,1080h ; AX = 1080h = 16,5 mov bx,1240h ; BX = 1240h = 18,25 add ax,bx ; AX = 22C0h = 34,75 sub ax,bx ; AX = 1080h = 16,5