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 ;повторяем ввод