Поразрядное сравнение
Условие:
Проссумировать 2 массива десятичных восьмирозрядных чисел 5C00:1000H и 5000:2000H. Результат который больше 5000H поместить в массив 5F00:3000H. Длина массива 150 чисел.
Пишем мы программы для микропроцессора 1810. Я смог написать программу только для "двоичных восьмирозрядных" чисел вместо "десятичных восьмирозрядных". Вот текст программы:
org 100h
mov cx,150d
mov si,1000h
m2: mov bx,5C00h
mov ds,bx
mov al,[si]
mov bx,5000h
mov ds,bx
add al,[si+1000h]
cmp al,50h
jc m1
mov bx,5f00h
mov ds,bx
mov [si+2000h],al
m1: si,1h
loop m2
end
Эта программа, которую написал я. Преподаватель не принял работу. Сказал что нужно написать согласно заданию. Одногрупники тоже розводят руками. Не знаю что делать. Это последняя работа. Прошу помочь в написании. Преподаватель посоветовал плюсовать десятичные восьмирозрядные числа по 2 разряда, но там нужно учитывать флаги(в случае переполнения, например). Не знаю как это сделать...
И ещё - как можно оптимизировать (то есть сделать лучше) уже написанную мной программу.
Буду благодарен за помощь.
В общем алгоритм такой ))
берёш младшие полубайты и складуешь , если резулт больше 9 то вычитаешь из него 9 и единицу запоминаешь . остаток - младший полубайт результата .
Потом берёшь старшие полубайты . тоже складуешь между собой и добовляешь запомненую единицу (если есть) . если сумма больше 9 , то вычитаешь 9 и орёшь что случилось переполнение . эта сумма - старший полубайт нужного тебе результата сложения двух BCD чисел .
Вообщето для таких вопросов есть спец раздел .
Успеха )).
Добрый день! Я студент 4-го курса НТУУ КПИ. По курсу "Микропроцессорная техника" задали написать программу. Но не знаю как её реализовать. Прошу помочь в написании.
Условие:
Проссумировать 2 массива десятичных восьмирозрядных чисел 5C00:1000H и 5000:2000H. Результат который больше 5000H поместить в массив 5F00:3000H. Длина массива 150 чисел.
Пишем мы программы для микропроцессора 1810. Я смог написать программу только для "двоичных восьмирозрядных" чисел вместо "десятичных восьмирозрядных". Вот текст программы:
org 100h
mov cx,150d
mov si,1000h
m2: mov bx,5C00h
mov ds,bx
mov al,[si]
mov bx,5000h
mov ds,bx
add al,[si+1000h]
cmp al,50h
jc m1
mov bx,5f00h
mov ds,bx
mov [si+2000h],al
m1: si,1h
loop m2
end
Эта программа, которую написал я. Преподаватель не принял работу. Сказал что нужно написать согласно заданию. Одногрупники тоже розводят руками. Не знаю что делать. Это последняя работа. Прошу помочь в написании. Преподаватель посоветовал плюсовать десятичные восьмирозрядные числа по 2 разряда, но там нужно учитывать флаги(в случае переполнения, например). Не знаю как это сделать...
И ещё - как можно оптимизировать (то есть сделать лучше) уже написанную мной программу.
Буду благодарен за помощь.
оптимизация делаецца так:
mov bx, 5000h
mov ds, bx
mov bx, 5C00h
mov cx, 150
mov dx, 5F00h
mov es, dx
mov ah, 0 ; здесь мы будем хранить перенос
add_loop:
lodsb ; то же что mov al, [si] / inc si
xchg bx, ds
add al, [si + FFFh] ; хотелось бы +1000 но si уже увеличился на 1!
aaa ; десят. коррекция после слож-я, возможно эта команда имеет др. мнемонику -- нада смотреть мануал по асму
add al, ah ; добавляем перенос из предю разряда
mov ah, 0 ; и запоминаем текущий перенос
adc ah, 1
xchg bx, ds
stosb ; сохраняем сумму
loop add_loop
По моему так, как разберешься с заданием -- пиши, мне самому интересно стало правильно ли я понял
Это т.н. упакованые BCD числа (binary digital decimal, вроде). Они бывают 2х видов - упакованые и неупакованые. Неупакованое число - 1 цифра на байт в памяти. Упакованые - соответсвенно 2 цифры на байт, как результать в BCD арифметике имеем не 256 значений на байт - а только 100 (00h - 99h) при чем значения вида 1Bh не используются. Для работы с такими цифрами, как правильно заметили в предыдущем примере существуют спекоманды - aaa(сложение), aad(деление), aam(умножение), aas(вычитание). НО работают эти команды только с неупаковаными числами - нада преобразовывать, и хз есть ли такие команды в вашем модном процике 1810 .
Могу как алгоритм порекомедовать следующее. Читаеш в регистр один байт. Обнуляеш 4 старшие разряда. (and al, 00001111b) Число в оставшихся 4 младших битах будет числом от 0 до 9. Добавляеш его к сумме. Читаеш опять-таки то-же байт в регистр. Cдвигаеш на 4 разряда вправо (shr al, 4). Число в ПОЛУЧИВШИХСЯ 4 младших битах будет числом от 0 до 9. МНОЖИМ его на 10. Добавляеш его к сумме.
Потом двоичную сумму придется вручную разобрать в BCD формат. Тут уже дели на 10 и остаток записывай, пока все число не разделиш.