
Лабораторна робота №5
Тема:макрозасоби мови асемблер.
Завдання:
1. переписати Програму 2.1 з використанням макросів;
Текст програми:
; LAB_5
OUT_STR Macro STR ; макрос выводим на экран строку
push AX
mov AH, 09h
mov DX, offset STR
int 21h
pop AX
endm
;----------------------------------------------------------------------------------------------------------
INPUT Macro ; макрос вводим число с клавы, результат в АХ
mov DX, offset Buff ; вводим наше число
mov AH, 10
int 21h
mov SI, offset Buff+1 ; адрес где лежит кол-во введенных цифр
xor CX, CX
mov CL, [SI] ; берем кол-во введенных цифр для цикла
cmp CX, 0 ; если ноль - на выход
je exit_lbl
mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
inc SI ; берем первый разряд нашего числа
mov AL, [SI] ; пхаем его в регстр для обработки
cmp AL,'-' ; если минус - установить флаг
jne positiv
mov fl, 1 ; флаг негативного числа
dec CL ; кло-во цифр стало на 1 меньше
cmp CX, 0 ; если кроме минуса там ничего нет - на выход
je exit_lbl
inc SI ; следующий разряд нашего числа
positiv:
xor AX, AX
xor DI, DI
mov DI, 10 ; 10 - кратность
dec SI ; адрес цифры возвращаем обратно
lbl1:
inc SI ; берем следующий разряд нашего числа
xor BX, BX
mov BL, [SI] ; пхаем его в регстр для обработки
sub BL, '0' ; обрабатываем его - перобразуем в людской вид
cmp BL, 9 ; если это не цифра - на выход
ja exit_lbl
mul DI ; умножаем его на 10
add AX, BX ; складываем до купы
loop lbl1
cmp fl,1 ; если у нас отрицательное число
jne ee
neg AX ; цепляем ему минус
ee:
jmp end_macro
exit_lbl:
ERROR_EXIT
end_macro:
endm
;----------------------------------------------------------------------------------------------------------
OUTPUT Macro ; макрос выводим на экран число из АХ
mov BX, 10 ; основа системы счисления
mov DI, offset Buff+6 ; счетчик на конец буффера
mov fl, 0 ; по умолчанию сбрасываем флаг негативного числа
cmp AX, 0 ; наше число отрицаиельное?
jge Pr1
neg AX ; если да, то делаем его положительным
mov fl, 1 ; но устанавливаем флаг отриц. числа
Pr1: xor DX, DX ; тут будет остаток
div BX ; делим АХ на 10 - остаток в DX
mov SI, offset Tabl ; адес начала таблицы с символами
add SI, DX ; адрес нужного нам символа
mov DL, [SI] ; пхаем его в память, там где Buff
mov [DI], DL
dec DI ; переходим на следующее место
cmp AX, 0 ; а не закончилось ли у нас число?
jnz Pr1 ; если нет то опять за свое
cmp fl,1 ; если у нас отрицательное число
jne eee
mov DL, '-'
mov [DI], DL ; цепляем ему минус
dec DI ; переходим на следующее место
eee:
mov AH, 9 ; если да, то гуляем (выводим число на экран)
mov DX, DI ; это у нас место, где начинается символы числа
inc DX ; на самом деле чуть правее
int 21h
endm
;----------------------------------------------------------------------------------------------------------
ERROR_EXIT Macro ; макрос сообщаем, что все пропало и выходим
mov DX, offset text2
mov AH, 9
int 21h
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
endm
;----------------------------------------------------------------------------------------------------------
assume CS:code, DS:data
code segment
begin:
mov AX, data
mov DS, AX
INPUT ; ввод целого числа с клавы
OUT_STR text1 ; сообщаем, что все хорошо
OUTPUT ; вывод целого числа с АХ
; ждем нажатия любой клавиши
mov AH, 10h
int 16h
; завершение программы
mov AX, 4C00h
int 21h
code ends
data segment
Buff db 5, 6 dup(0), '$'
fl db 0
Tabl db '0123456789'
text1 db 13, 10, 'All ok', 13, 10, '$'
text2 db 13, 10, 'Error Exit', 13, 10, '$'
data ends
end
stak segment stack
db 256 dup(?)
stak ends
end begin
Блок-схема до програми:
Отримані результати:
100 All ok 100 -100 All ok -100
Висновки:Програма вирішує поставлене завдання. Теоретичні розрахунки відповідають отриманим. Програма працює правильно.