Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР№3.doc
Скачиваний:
2
Добавлен:
13.11.2019
Размер:
49.15 Кб
Скачать

2) Idiv операнд – деление чисел со знаком

В данной команде остаток имеет тот же знак, что и частное.

Ввод с клавиатуры и вывод на экран.

Для ввода данных с клавиатуры используются различные сервисные функции, которые будут рассмотрены в одной из следующих лабораторных работ. Для выполнения данной работы для ввода чисел можно воспользоваться готовыми процедурами, которые написаны заранее для удобства и содержатся в библиотечном модуле mylib.lib, находящемся в каталоге LIB.

На этапе компоновки исполняемого модуля (ЕХЕ-файла) необходимо включить процедуры, находящиеся в библиотеке mylib.lib в программу следующим образом:

tlink prog1,,,d:\tasm\lib\mylib

где prog1 – имя файла программы, а d:\tasm\lib – путь к каталогу, содержащему библиотечные файлы.

Для ввода целого числа будем пользоваться процедурой READ, после вызова которой введенное число попадает в регистр АХ. Для вывода на экран целого числа, находящегося в регистре АХ, будем использовать вызов процедуры WRITER.

Данные процедуры вызываются с помощью команды САLL. Эта команда передает управление процедуре, сохранив перед этим в стеке смещение к точке возврата. Процедура выполняется до тех пор, пока среди ее команд не встретится команда возврата RET, которая достает из стека адрес возврата и передает управление команде, следующей за командой САLL.

Поскольку процедуры READ и WRITER являются внешними для программы, которая будет их использовать, необходимо с помощью директивы EXTRN информировать компилятор о том, какие именно имена являются внешними, то есть определенными во внешнем модуле, скомпилированным самостоятельно и независимо от основного программного модуля. В нашем случае данная директива может быть использована следующим образом:

extrn read:near, writer:near

Передача управления на метку (с помощью команд JMP, Jхх, CALL) представляется в машинной команде как разность между адресом метки и адресом команды перехода. Передача управления бывает ближней (NEAR) и для ее обеспечения выполняется только модификация регистра-указателя команд IP (при этом адрес перехода может занимать в команде 1 байт или 1 слово). Данный тип передачи управления также называется внутрисегментной и обеспечивает передачу управления внутри текущего сегмента команд. Передача управления за пределы текущего сегмента команд называется межсегментной или дальней (FAR). Здесь уже необходима модификация регистров CS и IP и адрес перехода определяется значением адреса сегмента команд и смещением внутри сегмента.

После имени вызываемой внешней процедуры и двоеточия в директиве EXTRN указывается значение NEAR или FAR, которое характеризует тип вызываемой процедуры.

;Вывод на экран результата сложения двух чисел, введенных с клавиатуры

.model small

.data

a dw ? ;место в памяти для введенного числа

str1 db 'Сумма равна $' ;сообщение, предваряющее вывод суммы

.stack 32h

.code

.startup

extrn read:near, writer:near

call read ;вводим первое число, оно попадает в ах

mov a, ax ;сохраняем его в переменной а

call read ;вводим второе число, оно попадает в ах

add ax, a ;находим сумму, результат помещается в ах

mov bx, ax ;сохраним значение суммы в bx

mov ah, 9 ;выводим строку-сообщение

lea dx, str1

int 21h

mov ax,bx ;восстанавливаем в ах значение суммы

call writer ;и выводим сумму чисел на экран

.exit 0

end

Далее приведен пример ввода чисел в цикле и печать сообщения «Введено число Х».

str1 db 'Введено число $' ;сообщение

...

vvod: call read

mov bx, ax ;сохраним введенное число в bx

mov ah, 9 ;выводим строку-сообщение

lea dx, str1

int 21h

mov ax, bx ;восстанавливаем в ах число для вывода на экран

call writer ;и выводим его

jmp vvod ;повторяем ввод

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]