2013-03-02 2 views
0

Как использовать большие числа? например, 3441881739,30000000 и т. д.Как использовать большие номера?

mov eax,3441881739 

В этом случае значение eax является отрицательным числом. Как это исправить? раздели это? как? Мне нужно также добавить/sub/mul/div и т. Д. Операция cmp.

Может ли кто-нибудь объяснить и привести пример, как это сделать?

Я отметил fasm и nasm теги, но чужое собрание также приветствуется. Я на 32-битной машине.

+0

Если вы говорите о [множественная точности арифметик] (HTTP: // ан .wikipedia.org/wiki/Arbitrary-precision_arithmetic), * знак * интерпретируется инструкцией. В арифметике дополнений 2 'add/adc',' sub/sbb' являются одной и той же операцией, тогда как 'imul/mul',' idiv/div' отличаются в своей работе. –

+1

@BrettHale: Нет, add и adc являются * not * одинаковыми (и 'sub' не совпадает с' sbb'). Добавить то же самое, независимо от того, имеете ли вы дело с положительными или отрицательными номерами (или комбинацией), и то же самое с суб-, но 'add' и' sub' игнорируете бит переноса, где 'adc' и' sbb' не , –

+0

@JerryCoffin - Я только что понял, что мой комментарий плохо сформулирован. Я имел в виду, что 'add/adc' не ведет себя по-другому по отношению к предполагаемому биту знака. –

ответ

1

Если вы хотите иметь дело с цифрами больше 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 
3

Вы делаете это в сборе так же, как и на бумаге (длинное добавление, длительное умножение, длинное разделение). Вы разделяете число на части, вы несете, занимаете и так далее.

Если вы могли удерживать только цифры от 0 до 9, вы могли бы подумать о 32 как (10 * 3 + 2) или «32». Чтобы добавить, вы добавляете нижнюю часть, при необходимости переносите, а затем добавляете высокую часть. Чтобы вычесть, вы меняете знак и добавляете. Для того, чтобы размножаться, вы используете это:

(A * X + B) (C * X + D) = AC * X^2 + (AD + BC) * X + BD

Это так же, как вы do "32 * 12" как (3 * 10 + 2) (1 * 10 + 2) = (3 * 1) * 100 + (2 * 1 + 3 * 2) * 10 + 2 * 2 = 384

Чтобы разделить, вы делаете длинное разделение так же, как вы научились делать это на бумаге.

(Помните, все те люди, которые сказали, что вы должны были знать математику программирования. Это одна из многих причин. Вы должны сломать вещи вниз в очень маленьких частей программировать компьютеры в сборке.)

Смежные вопросы