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, просмотров: 433.