Вычитание в сборе с базой 10 EMU8086

Здравствуйте, я делаю калькулятор с основанием 10 на ассемблере, который может принимать числа с максимальной длиной 5 цифр ... поэтому есть два числа после того, как ввод был сделан, одно из пяти чисел копания хранится в ax и bl, например

AX - 23 45
BX - 00 01

Таким образом, значение ввода равно 12345, а другое, например, 23243, и оно хранится в CX и DX с той же идеей первого числа (которое хранится в AX и BX...). Теперь я сделал дополнительный код , но я не могу понять, как сделать код вычитания со всеми отрицательными проблемами...

Итак, что я подумал сделать, так это, например, взять bh (который я не использую, потому что число не может быть длиннее 6 цифр...), и если число отрицательное, я поставлю 1, а если оно положительное, я поставлю 0, так что проблема решена. Теперь проблема в том, что я не знаю, как заставить код работать, как со всей частью sub, переносом и всем остальным ... (в дополнение я использовал такие команды, как adc, daa ...)

последний пример: значение: 12345 и его положительное значение

AX - 23 45  
BX - 00 01 
(if Bh is 0 the number is positive if 1 its negative...)

Теперь значение: 23243 и его положительный CX-32 43 DX-00 02

Расчет 12345-23243(=-10898)

скажем, ответ идет на CX AND DX, поэтому он будет выглядеть так:

CX - 08 98
DX - 01 01

ответ: (-10898)

Может кто-нибудь, пожалуйста, помогите мне/дайте мне пример кода, который я буду знать, как это сделать?

Извините, если я немного запутался...

Спасибо. РЕДАКТИРОВАТЬ: вот код добавления, который вы запрашиваете:

proc Add_two_numbers;2 values useing stack...
    pop [150]
    pop dx
    pop cx
    pop bx
    pop ax
    add al,cl
    daa 
    mov cl,al
    mov al,ah
    adc al,ch
    daa
    mov ch,al
    mov al,bl
    adc al,dl
    daa
    mov dl,al
    push cx
    push dx
    push [150]
    ret
endp Add_two_numbers  

2-е редактирование: я выясняю, как сделать его отрицательным, поэтому мне просто нужны алгоритмы, которые под номером 2 не должны работать с числами, такими как 1000-2000, пожалуйста, заставьте его работать только с положительными значениями, такими как 2000-1000


person BananaBuisness    schedule 09.03.2015    source источник
comment
Было бы полезно пометить конкретную сборку, которую вы используете... x86?   -  person Segmented    schedule 09.03.2015
comment
Также можете ли вы показать соответствующий фрагмент кода, который вы используете? Лично я бы рекомендовал вам конвертировать в двоичный файл и работать с ним, а затем конвертировать обратно...   -  person Segmented    schedule 09.03.2015
comment
Извините emu8086 У меня нет кода вычитания, но есть сложение, это нормально?   -  person BananaBuisness    schedule 09.03.2015
comment
Если это поможет проиллюстрировать, что вы собираетесь делать с вычитанием, конечно.   -  person Segmented    schedule 09.03.2015
comment
Я думаю, это может дать лучшую перспективу, так что да... Секундочку...   -  person BananaBuisness    schedule 09.03.2015
comment
Хранение каждой десятичной цифры в отдельном регистре делает работу излишне сложной. Я не вижу здесь причин для этого. Я бы рекомендовал хранить каждое число со знаком или без знака в 1 или 2 16-битных регистрах, как обычно (например, dx:ax для одного значения и cx:bx для другого). Если входные данные являются строками, используйте atoi из библиотеки C, чтобы преобразовать каждую строку в целое число или реализовать свою собственную. Затем выполните вычитание с помощью sub и sbb. Затем выполните печать с помощью printf или реализуйте свой собственный.   -  person nrz    schedule 09.03.2015
comment
Не могу использовать библиотеки: P   -  person BananaBuisness    schedule 09.03.2015
comment
Только чистая сборка...   -  person BananaBuisness    schedule 09.03.2015
comment
Итак, я думаю, вы бы сделали что-то похожее на то, что вы сделали с ADC + DAA ... SUB + DAS должны работать, нет? Я не думаю, что BCD могут содержать отрицательные значения сами по себе, вам нужно будет обнаружить переполнение из флага и идти оттуда... HTH   -  person Segmented    schedule 09.03.2015
comment
Но будет ли он иметь форму отрицательного * числа, такого как ffff1? Или оно будет отрицательным, но число останется положительным   -  person BananaBuisness    schedule 09.03.2015
comment
Не уверен, я не работал с двоично-десятичной арифметикой, но если вы получите такое значение, вы можете преобразовать его обратно, используя дополнение до 2. Более простым решением может быть обнаружение заранее, если вы вычитаете большее значение из меньшего, и переворачивание значений и добавление знака после.   -  person Segmented    schedule 09.03.2015
comment
Я думаю, вы упускаете суть. Десятичные числа не для процессоров. Хотя они обеспечивают минимальные возможности преобразования, десятичные числа предназначены для людей. Получите правильный интерфейс: преобразуйте десятичное число в двоичное в человеко-машинном интерфейсе перед вычислением и преобразуйте его обратно в точке вывода.   -  person Weather Vane    schedule 09.03.2015
comment
@WeatherVane Я не знаю, как преобразовать десятичное число в двоичное в интерфейсе, можете ли вы мне подсказать?   -  person BananaBuisness    schedule 10.03.2015
comment
Как предлагает @Segmented, вы можете использовать sbb и das. Но операции BCD ничего не знают об отрицательных числах. Если из меньшего вычесть большее число, то получится число с дополнением до 10. Например, если у вас есть 6 операций с двоично-десятичным числом, и вы вычисляете 2000-2123, вы получите 999877, но вам действительно нужно -123, которое является 10-м дополнением 999877 с - впереди (10-е дополнение определяется путем взятия дополнения каждая цифра относительно 9, затем добавление 1, так что 000122 + 1 или 123).   -  person lurker    schedule 12.03.2015


Ответы (1)


Отвечая на ваш комментарий, это один из способов преобразования из десятичного числа и обратно, используя C в качестве примера. Я оставляю вас кодировать его на ассемблере!

#include <conio.h>

#define MAX  100000000

// input a signed decimal number
int inp_num(void) {
    int number=0, neg=0, key;
    while (number < MAX) {
        key = _getche();
        if (key == '-') {
            if (number==0)
                neg = 1;        // else ignore
        }
        else if (key >= '0' && key <= '9')
            number = number * 10 + key - '0';
        else
            break;
    }
    if (neg)
        number = -number;
    _putch('\n');
    return number;
}

// output a signed number as decimal
void out_num(int number) {
    int digit, suppress0, d;
    suppress0 = 1;              // zero-suppression on
    if (number < 0) {
        _putch('-');
        number =-number;
    }
    for (d=MAX; d>0; d/=10) {
        digit = number / d;
        if (digit)              // if non-0
            suppress0 = 0;      // cancel zero-suppression
        if (!suppress0)
            _putch('0' + digit);
        number -= digit * d;
    }    
}

int main(void) { 
    int number;
    number = inp_num();
    out_num(number);
    return 0;
}
person Weather Vane    schedule 10.03.2015