Если вы хотите иметь дело с цифрами больше 2 -1, вам нужно выполнить арифметику с несколькими точками. Например, чтобы добавить пару 64-разрядных чисел вы могли бы сделать что-то вроде этого:
mov eax, A_1 ; essentially C = A + B
mov edx, B_1
add eax, edx ; note that for the low word, we just add
mov C_1, eax
mov eax, A_2
mov edx, B_2
adc eax, edx ; but for the high word, we add with carry
mov C_2, eax
Имея доступ к биту переноса означает, что это значительно проще, чем с большинством высокоуровневых языков. Существует также вычитание с заимствованием, чтобы сделать многословное вычитание простым. Умножение и деление зависят немного. Обычное 32-битное умножение приводит к 64-битовому результату (низкое слово в eax, высокое слово в edx). Если вы хотите что-то вроде умножения на 64x64 бит (с результатом 128 бит), вам нужно будет реализовать это самостоятельно.
Например, умножение (без использования встроенных мулов/IMUL инструкции) можно сделать что-то вроде этого:
mult proc
; multiplies eax by ebx and places result in edx:ecx
xor ecx, ecx
xor edx, edx
mul1:
test ebx, 1
jz mul2
add ecx, eax
adc edx, 0
mul2:
shr ebx, 1
shl eax, 1
test ebx, ebx
jnz mul1
done:
ret
mult endp
Если вы говорите о [множественная точности арифметик] (HTTP: // ан .wikipedia.org/wiki/Arbitrary-precision_arithmetic), * знак * интерпретируется инструкцией. В арифметике дополнений 2 'add/adc',' sub/sbb' являются одной и той же операцией, тогда как 'imul/mul',' idiv/div' отличаются в своей работе. –
@BrettHale: Нет, add и adc являются * not * одинаковыми (и 'sub' не совпадает с' sbb'). Добавить то же самое, независимо от того, имеете ли вы дело с положительными или отрицательными номерами (или комбинацией), и то же самое с суб-, но 'add' и' sub' игнорируете бит переноса, где 'adc' и' sbb' не , –
@JerryCoffin - Я только что понял, что мой комментарий плохо сформулирован. Я имел в виду, что 'add/adc' не ведет себя по-другому по отношению к предполагаемому биту знака. –