Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поразрядное сравнение

14K
23 декабря 2005 года
Motion
2 / / 10.12.2005
Добрый день! Я студент 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 разряда, но там нужно учитывать флаги(в случае переполнения, например). Не знаю как это сделать...
И ещё - как можно оптимизировать (то есть сделать лучше) уже написанную мной программу.
Буду благодарен за помощь.
252
26 декабря 2005 года
koderAlex
1.4K / / 07.09.2005
С каких пор 5000н стало восьми разрядным ?
В общем алгоритм такой ))
берёш младшие полубайты и складуешь , если резулт больше 9 то вычитаешь из него 9 и единицу запоминаешь . остаток - младший полубайт результата .
Потом берёшь старшие полубайты . тоже складуешь между собой и добовляешь запомненую единицу (если есть) . если сумма больше 9 , то вычитаешь 9 и орёшь что случилось переполнение . эта сумма - старший полубайт нужного тебе результата сложения двух BCD чисел .
Вообщето для таких вопросов есть спец раздел .
Успеха )).
1.8K
11 января 2006 года
LM(AL/M)
332 / / 20.12.2005
Цитата:
Originally posted by Motion
Добрый день! Я студент 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

По моему так, как разберешься с заданием -- пиши, мне самому интересно стало правильно ли я понял

398
23 января 2006 года
Alexandoros
630 / / 21.10.2005
Цитата:
десятичных восьмирозрядных


Это т.н. упакованые 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 и остаток записывай, пока все число не разделиш.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог