Скачиваний:
85
Добавлен:
11.02.2014
Размер:
398.44 Кб
Скачать

Лабораторна робота №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

Висновки:Програма вирішує поставлене завдання. Теоретичні розрахунки відповідають отриманим. Програма працює правильно.

Соседние файлы в папке лабораторные работы по ASSAMBLER