Процедура очистка области результата
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Z10XMUL PROC

   Mov PRODUCT,0000; Обнулить

   Mov PRODUCT+2,0000; ячейки

   Mov PRODUCT+4,0000; памяти.

   Mov PRODUCT+6,0000;

   Ret; Вернуться в основную программу.

Z10XMUL Endp; Конец процедуры.

CODESG Ends; Конец кодового сегмента.

end BEGIN; Конец программы.

5.2 Сложение чисел в ASCII-формате. (СОМ – программа)

 

TITLE ASCADD (COM) Сложение чисел в ASCII-формате

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,SS:CODESG

Org 100H

BEGIN: Jmp SHORT MAIN

ASC1 DB  '578'; Символьные элементы данных.

ASC2 DB  '694'

ASC3 DB '0000'

MAIN PROC NEAR

   Clc

   Lea si,asc1+2; Переслать в регистры адреса ASCII-чисел.

   Lea di,asc2 +2

   Lea bx,aasc1+3

   Mov сх,03; Задаем количество циклов.

A20:

   Mov ah,00; Очистить регистр AH.

   Mov al,[si]; Загрузить ASCII-байт.

   Adc al,[di]; Сложение (с переносом).

   Aaa; Коррекция для ASCII.

   Mov  [bx],al; Сохранение суммы.

   Dec si

   Dec di

   Dec bx

   Loop А20; Циклиться 3 раза.

   Mov [bx],ah; Сохранить перенос.

   Ret

MAIN Endp

CODESG Ends

  End BEGIN

5.3 Многословное сложение (ЕХЕ – программа)

Максимально возможное значение знакового числа в регистрах процессора равное + 32767 и -32768, ограничивает возможности компьютера при выполнении арифметических операций. Потому арифметические операции сложения двухсловных и более чисел выполняют с помощью небольших процедур, которые обеспечивают сначала сложение крайних правых слов с сохранением результата в переменной. А затем складывают левые слова и суммируют результат с переменной, использую команду ADC, так как сумма может превышать емкость шестнадцатиразрядных регистров процессора.

Пример сложения двойных слов:

.Model small

.stack

.data

SDD1 dd 56745890

SDD2 dd 63247659

REZ1 dd (?)

REZ2 dd (?)

     .code

beg: Mov ax,@data; Пересылка начального адреса сегмента данных в АХ.

     Mov ds,ax; Инициализация сегментного регистра DS.

     Call M1; Вызов процедуры сложения двойных слов.

     Call M2; Вызов процедуры сложения чисел любой длины.

     Jmp M3; Переход на команды выхода из программы.

M1 PROC

     Mov ax,word ptr sdd1; Пересылка в АХ правой части 1-го слагаемого.

     Add ax,word ptr sdd2; Сложение с правой частью 2-го слагаемого.

     Mov word ptr rez1,ax; Пересылка суммы в память.

     Mov ax,[sdd1+2]; Пересылка в АХ левой части 1-го слагаемого.

     Adc ax,[sdd2+2]; Сложение с левой частью 2-го слагаемого и    

                                   содержимым регистра CF .

     Mov word ptr [rez1 + 2],ax; Сохранение суммы в памяти.

      Ret; Выход из процедуры.

M1: Endp; Конец процедуры.

M2: PROC

     Clc

     Mov cx,2

     Lea si,word ptr sdd1

     Lea di, word ptr sdd2

     Lea bx,word ptr rez1

E2: Mov ax,[si]

     Adc ax,[di]

     Mov [bx],ax

     Dec si

     Dec si

     Dec di

     Dec di

     Dec bx

     Dec bx

     Loop E2

     Ret

M3: Mov ax,4c00h

     Int 21h

     End beg

5.4 Преобразование шестнадцатеричной цифры в ASCII код.

(ЕХЕ – программа)

Hex ascii − имя подпрограммы получения символьного представления четырехбитового числа. На входе в подпрограмму: исходное число должно находится в младшей половине регистра AL, адрес строки, куда надо поместить результат, находится в регистрах DS:SI.  На выходе из подпрограммы: ASCII представление полученного числа в памяти по адресу находящемуся в DS:SI. Исходное содержимое регистра AL разрушается.

.model small

.stack 300h

.data

tblhex db ‘0123456789ABCDEF’; Строка шестнадцатиричных символов.

result db ‘*h’,10, 13, ‘$’;  Строка результата.

.code

start: Mov AX,@data; Инициализируем

     Mov DS,AX; сегментный регистр DS.

     ……

     Mov AL,15

     Lea SI,result

     Call hex asii

     Mov AH,09H

     Lea DX,result

     Int 21H

Hex ascii proc

     Push BX

     Lea BX,tablhex

     Xlat

     Mov [SI],AL

     Pop BX

     Ret

Hex ascii endp; Конец процедуры.

     …….

     ……

Mov AX,4C00H

Int 21H

End start; Конец программы.

Комментарии к программе.

     Пусть исходное число, находится в регистре AL. Для преобразования этого числа в код ASCII, используем команду табличной трансляции XLAT, которая позволяет осуществить выборку байта из таблицы по его индексу. Перед исполнением этой команды в регистрах DS:BX должен находится полный адрес таблицы трансляции, а в регистре AL - смещение выбираемого байта в таблице, т.е. его индекс. Процедура Hex ascii может быть вызвана из любого места в программе. Поэтому, для того чтобы она не нарушала основную программу, первая команда процедуры сохраняет в стэке регистр BX, который затем настраивается на смещение таблицы трансляции. В регистре AL уже находится преобразуемое число, которое, согласно построению таблицы tblhex, является индексом требуемого символа можно выполнять команду xlat. Результат преобразования из регистра AL отправляется в ячейку памяти, по адресу, находящемуся в регистре SI.

5.5 Преобразование ASCII формата в двоичный формат.

Коды цифр в ASCII-формате представлены парой символов: тройкой и собственно цифрой. Например, код 0 в ASCII−формате будет − 30, код цифры 4 − 34, код 8 − 38 и т.д. Метод преобразования базируется на том, то ASCII-формат имеет основание 10, а компьютер выполняет арифметические операции только над числами с основанием 2. Процедура преобразования проводится по следующему алгоритму:

1.  Преобразование данных начинают с самого правого байта числа в ASCII-формате и обрабатывают справа налево.

2.  Удаляют тройки из левых шестнадцатеричных цифр каждого ASCII-байта.

3. Умножают ASCII-цифры на 1, 10, 100 (01Н, ОАН, 64Н) и т.д. и складывают результаты.

Пример преобразование числа 31323334 из ASCII-формата в двоичный формат:

– Удалим тройки из числа в ASCII формате. Получим число 1234;

– Преобразуем полученное число в шестнадцатиричное

Десятичное                                            Шестнадцатиричное

4 × 1    =         4                                4

3 × 10      =       30                               IE

2 × 100   =      200                             С8

1 × 1000 =    1000                           ЗЕ8

Результат            1234                           04D2

Проверьте, что шестнадцатеричное число 04D2H действительно соответствует десятичному числу 1234. В процедуре ASCBI выполняется преобразование ASCII-числа 1234 в двоичный формат. В примере предполагается, что длина ASCII-числа равна 4 и она записана в поле ASCLEN. Для инициализации адрес ASCII-поля ASCVAL-1 заносится в регистр SI, а длина этого поля - в регистр ВХ. Команда на метке В20 пересылает ASCII-байт в регистр AL. Процедура преобразования представлена программой в COM формате

TITLE EXCONV (СОМ) - Преобразование ASCII и двоичных форматов CODESG SEGMENT PARA ‘Code’

ASSUME CS: CODESG, DS:CODESG, SS:CODESG

ORG  IOOH

 BEGIN:  Jmp SHORT MAIN

ASCVAL DB '1234'; Элементы данных

BINVAL DB 0; Сюда запишется двоичное число.

ASCLEN DB 4; Это длинна шестнадцатиричного числа.

MULT10 DB 1; Фактор умножения.

MAIN PROC NEAR; 0сновная  процедура.

Call ASCB1; Вызвать  преобразование  в ASCII коды.
Call BIASC; Вызвать преобразование в двоичное число.
Ret; Вернуться в основную программу.

MAIN Endp; Конец процедуры.

     Преобразование ASCII в двоичное число

ASCBI  PROC

Mov        CX,10; Фактор умножения переслать в СХ.

Lea        SI,ASCVAL-1; Адрес ASCVAL.

Mov BX,ASCLEN; Длина ASCVAL.
B20: Mov AL,[SI + ВX]; Выбрать ASCII символ.

And       AX,000FH; 0чистить зону тройки.

Mul       MULT10; Умножить на фактор 10.

Add       BINVAL,AX; Прибавить к двоичному.

Mov      AX,MULT10; Вычислить следующий

Mul       СХ ; фактор умножения.

Mov      MULT,AX; Переслать новый фактор в MULT.

Dec        BX; Последний ASCI1-символ?

Jnz        B20; Нет - продолжить вычисление.

Ret; Вернуться в основную программу.

ASCBI  ENCP; Конец процедуры.

В этой процедуре используется адрес ASCVAL-1 плюс содержимое регистра ВХ (4), т.е. получается адрес ASCVAL + 3 (самый правый байт поля ASCVAL). В каждом цикле из содержимого регистра ВХ вычитается 1, следовательно, адрес уменьшается  и обращение происходит к следующему слева байту. Для данной адресации можно использовать регистр ВХ. В каждом цикле происходит также умножение поля MULT10 на 10, что дает в результате множители 1,10,100 и т.д.  Такой прием применен лишь для большей ясности, однако множитель можно хранить в регистрах SI или DI, что повышает производительность программы.

5.6 Преобразование двоичного формата  в ASCII формат

Для того чтобы напечатать или отобразить на экране арифметический результат, необходимо преобразовать его в ASCII-формат, так как при вводе и выводе информации в ПК используются специальные коды представления данных − коды ASCII.  Для представления результата вычисления в ASCII формате, необходимо результат перевести в десятичную систему счисления и перед каждой цифрой результата дописать цифру 3. Операция перевода в десятичную систему представляет собой процесс обратный предыдущему. Вместо умножения, используется деление двоичного числа на 10 (ОА), пока результат не будет меньше 10.  Остатки, которые лежат в границах от 0 до 9, образуют число в ASCII формате. В качестве примера рассмотрим преобразование шестнадцатиричного числа 4D2H в десятичный формат:

 Частное  Остаток

4D2 / А =   7В                                4

7В / А =   С                                  3

С / А =    1                                  2

Так как последнее частное 1 меньше, чем 0АН, то операция завершена. Остатки вместе с последним частным образуют результат в ASCII-формате, записываемый справа налево - 1234. Все остатки и последнее частное должны записываться в память с тройками, то есть иметь следующий вид:  31323334.

     BIASC PROC

Mov С,0010; Фактор деления в СХ.

Lea SI.ASCVAL+3; Адрес ASCVAL.

Mov AX,BINVAL; Загрузить двоичное число.
С20: Смр АХ,0010; 3начение АХ меньше 10?

Jb СЗ0; Да – выйти из процедуры.

Xor DX,DX; 0чистить часть частного.

Div СХ; Разделить на 10.

Or DL,30H; Преобразовать в ASCII символ.

Mov [SI],DL; 3аписать ASCII-символ.

Dec SI; Модифицировать адрес.

Jmp C20; Перейти безусловно в С20.

С30: Or AL,30H;.3аписать последнее частное

Mov [SI],AL; как ASCII-символ.

Ret; Вернуться в основную программу.

BIAS ENDP; Конец процедуры.

CODESG Ends; Конец сегмента.

End BEGIN; Конец программы.





Дата: 2018-11-18, просмотров: 382.