Сложение: A + B : result[high] = A[high] + B[high] + carry_add(A[low],B[low]) result[low] = A[low] + B[low] Вычитание: A + B : result[high] = A[high] - B[high] - carry_sub(A[low],B[low]) result[low] = A[low] - B[low] Для начала посмотрим на Carry Flag и команду Addition with Carry. Пусть EBX указывает на первое число Пусть ECX указывает на второе число Пусть EDX указывает на результат Сложение и Вычитание
mov eax,[ebx] add eax,[ecx] mov [edx],eax mov eax,[ebx+4] adc eax,[ecx+4] ; Вот зачем надо сложение с CF mov [edx+4],eax |
mov eax,[ebx] sub eax,[ecx] mov [edx],eax mov eax,[ebx+4] sbb eax,[ecx+4] ; Вот зачем нужно вычитание с CF mov [edx+4],eax |
unsigned short s1; // source chunk 1 unsigned short s2; // source chunk 2 unsigned short result; // resulted chunk unsigned long r1 = s1; unsigned long r2 = s2; unsigned long t = r1 + r2; result = (unsigned short) t; carry = (t > 0x10000)? 1 : 0; // если вылезло за пределы то был перенос/заем |
Сложности псевдовекторных операций (представленны для векторов длинны 4): ------------------------------------------- Сложение 1 сложение 5 логических ------------------------------------------- Умножение на скаляр 2 умножения 5 логических ------------------------------------------- Сдвиг 1 сдвиг 1 логическая ------------------------------------------- Negate (-X) 1 вычитание 3 логических ------------------------------------------- Логические 1 логическая ------------------------------------------- Сравнение (беззнаковое) 1 сравнение 2 логических ------------------------------------------- Сравнение (знаковое) 1 сравнение (2 сдвига) 2 логических -------------------------------------------