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

Ввод с клавиатуры средствами dos

Функция DOS 0Ah - Считать строку символов из STDIN в буфер

Ввод: AH=0Ah

DS:DX=адрес буфера

Для вызова этой функции надл подготовить буфер, первый байти которого содержит максимальное число символов для ввода (1-254), при наборе строки обрабатываются клавиши Esc, F3, F5, СTRL-C, CTRL-Break и т.д., как и при наборе команд DOS (то есть Esc начинает ввод сначала, F3 восстанавливает подсказку для ввода, F5 запоминает текущую строку как подсказку, BackSpace стирает предыдущий символ). После нажатия клавиши клавиши Enter строка (включая последний символ CR (0Dh) ) записывается в буфер, начиная с третьего байта. Во второй байт записыватся длина реально введенной строки без учета последнего CR.

Вывод: буфер содержит введенную строку

Функция DOS 01h - Считать символ из STDIN с эхом, ожиданием и проверкой на CTRL-BREAK

Ввод: AH=01h

Вывод: AL=ASCII - код символа или 0. Если AL=0, второй вызов функции возвратит в AL расширенный ASCII - код символа.

Функция DOS 08h - Считать символ из STDIN без эха, с ожиданием и проверкой на CTRL-BREAK

Ввод: AH=08h

Вывод: AL=ASCII - код символа или 0. Если AL=0, второй вызов функции возвратит в AL расширенный ASCII - код символа.

Функция DOS 07h - Считать символ из STDIN без эха, ожиданием и без проверки на CTRL-BREAK

Ввод: AH=07h

Вывод: AL=ASCII - код символа или 0. Если AL=0, второй вызов функции возвратит в AL расширенный ASCII - код символа.

Функция DOS 06h - Считать символ из STDIN без эха, без ожидания и без проверки на CTRL-BREAK

Ввод: AH=06h

Вывод: AL=ASCII - код символа или 0. Если AL=0, второй вызов функции возвратит в AL расширенный ASCII - код символа.

Модели памяти и упрощенные директивы определения сегментов

Модели памяти задаются директивой .model

.model модель, язык, модификатор

где модель одно из следующих слов

TINY - код, данные и стек в одном сегменте

SMALL - код размещается в одном сегменте, данные и стек в другом

COMPACT - код размещается в одном сегменте, а для хранения данных могут использоваться несколько сегментов

MEDIUM - код в нескольких сегментах, а все данные в одном

LARGE и HUGE - и код и данные могут занимать несколько сегментов

язык - необязательный операнд, принимающий значения C, PASCAL, BASIC, FORTRAN, SYSCALL, STDCALL. Если он указан, ассемблер считает, что все процедуры рассчитаны на вызов из программы на соотвествующем языке высокого уровня, так что например, если указана язык С, все имена ассемблерных процедур, объявленных как PUBLIC, будут изменены так, чтобы начинаться с символа подчеркивания, как это принято в С.

модификатор - необязательный операнд, принимающий значения NEARSTACK или FARSTACK. Во втором случае сегмент стека не будет объединяться в одну группу с сегментами данных

После того как модель памяти определена, вступают в силу упрощенные директивы определения сегментов, объединяющие действия директив SEGMENT и ASSUME. Кроме того, сегменты объявленные упрощенными директивами, не требуется закрывать директивой ENDS - они закрываются сами, как только ассемблер обнаруживает новую директиву определения сегмента или конец программы.

Директива .Code описывает основной сегмент кода

.code имя_сегмента

эквивалентно

_TEXT segment word public 'CODE'

для моделей TINY, SMALL и COMPACT и

name_TEXT segment word public 'CODE'

для моделей MEDIUM, HUGE и LARGE (name - имя модуля, в котором описан данный сегмент). Все сегменты, описанные в одном модуле объединяются в один сегмент с именем name_TEXT.

Директива .Stack - описывает сегмент стека

.stack размер

эквивалентно

STACK segment para public 'stack'

Необязательный параметр указывает размер стека. По умолчанию он равен 1 килобайту.

Директива .Data - описывает сегмент данных

.data

эквивалентно

_DATA segment word public 'DATA'

Программа типа COM

. .model tiny ; модель памяти, используемая для COM

.code ; начало сегмента кода

org 100h ; начальное значение счетчика 100h

start: mov ah,9 ; номер функции в AH , 9 ая функция – вывод ; строки

mov dx,offset message ;адрес строки в DS

int 21h ; вызов системной функции

ret ; завершение COM программы

message db "Hello World!",0Dh,0Ah,'$' ; строка для вывода

end start ; конец программы

Компиляция программы для TASM

tasm /zi/l hello1.asm

tlink /t /x/ /v hello1.obj

Программа типа EXE

.model small ; модель памяти для EXE

.stack 100h ; сегмент стека - 256 байт

.code

start: mov ax, DGROUP ;адрес сегмента данных

mov ds, ax ; помещается в DS

mov dx, offset message ; в dx смещение до строки

mov ah,9 ; в ah номер функции, 9 ая функция – вывод ; строки

int 21h

mov ax,4c00h ; завершение программы

int 21h

.data ; сегмент данных

message: db "Hello World!",0Dh,0Ah,'$'

end start

Компиляция программы для TASM

tasm /zi/l hello1.asm

tlink /x /v hello1.obj

Задания

Вывести меню из трех пунктов

1. Ввод данных

2. Вывод данных

3. Выход

После того, как пользователь выберет какой - либо пункт меню, выполняется соответствующее действие и меню снова появляется на экране (за исключением последнего пункта меню), в случае вывода данных результат должен оставаться на экране до нажатия любой клавиши.

а) ввод данных - вводится строка символов целиком, в которой все вхождения символа 'a' заменяются на 'b', выводится результирующая строка

б) ввод данных - вводится строка символов целиком, выводится та же строка посимвольно в обратном порядке

в) ввод данных - вводится строка символов посимвольно, строчные буквы заменяются заглавными

г) ввод данных - вводится строка символов целиком, в которой все вхождения цифры заменяются на следующий по порядку символ, выводится результирующая строка

д) ввод данных - вводится строка символов посимвольно, если последовательно вводится несколько пробелов, оставить только один

Оформить программу в виде COM и EXE файлов. Продемонстрировать перенаправление стандартного ввода - вывода, то есть считать входные данные из входного файла и записать результат в выходной файл.

В приложении приведены примеры программ посимвольного и строчного ввода и посимвольного и строчного вывода.

Приложение

Программа, которая осуществляет ввод строки целиком и вывод посимвольно

отделяя каждый символ пробелом.

.model small ; модель памяти для EXE

.stack 100h ; сегмент стека - 256 байт

.code ; сегмент кода

start: mov ax, DGROUP ;адрес сегмента данных

mov ds, ax ; помещается в DS

mov dx, offset message ; в DX смещение до строки

mov ah, 9 ; 9-ая функция - вывод строки

int 21h

mov ah, 10 ; 10-ая функция - ввод строки

mov dx, offset string ; смещение до строки

int 21h

mov cl,string+1 ; в cl количество символов в строке

mov bx,offset string+2 ; в bx смещение до первого символа

; строки

mov dx,offset crlf ; в DX смещение до строки

mov ah,9 ; 9-ая функция - вывод строки

int 21h

cyc1: cmp cl,0 ; цикл - пока не выведем все символы

je ex

mov ah,2 ; 2-ая функция - вывод символа

mov dl,[bx] ; в dl - символ для вывода

int 21h

mov ah,2 ; 2-ая функция - вывод символа

mov dl,' ' ; в dl - символ для вывода

int 21h

dec cl ; уменьшение счетчика

inc bx ; увеличение указателя

jmp cyc1

ex: mov ah,8 ; 8-ая функция - ввод символа без

; отображения на экране

int 21h

mov ax,4c00h ; функция - 4Ch - завершение программы

int 21h

.data ; сегмент данных

string db 61,62 DUP (?) ; буфер для введенной строки

message db "Input String!",0Dh,0Ah,'$' ;строка - сообщение

crlf db 0Dh,0Ah,'$' ; перевод строки

end start

Программа, которая осуществляет ввод строки посимвольно и вывод посимвольно, отделяя каждый символ пробелом

.model small ; модель памяти для EXE

.stack 100h ; сегмент стека - 256 байт

.code ; сегмент кода

start: mov ax, DGROUP ; адрес сегмента данных

mov ds, ax ; помещается в DS

mov dx, offset message ; смещение до строки в dx

mov ah, 9 ; функция 9 - вывод строки

int 21h

mov bx, offset string ; в bx смещение до строки

mov cl,0 ; обнуление счетчика

inp_cyc: mov ah, 1 ; функция - ввод символа

int 21h

cmp al,13 ; символ - перевод строки ?

je out_data ; если равно переход на метку out_data

inc bx ; увеличение указателя bx++

mov [bx],al ; запись символа в строку

inc cl ; увеличение счетчика cl++

jmp inp_cyc ; переход на начало цикла

out_data: mov bx, offset string ; в bx смещение до строки

mov dx,offset crlf ; в dx смещение до строки

mov ah,9 ; функция 9 - вывод строки

int 21h

cyc1: cmp cl,0 ; счетчик равен нулю ? (cl == 0)

je ex ; если равно переход на метку ex

mov ah,2 ; функция 2 - вывод символа

mov dl,[bx] ; в dl - симвлол для вывода

int 21h

mov ah,2 ; функция 2 - вывод символа

mov dl,' ' ; в dl - симвлол для вывода

int 21h

dec cl ; уменьшение счетчика cl--

inc bx ; увеличение укзателя bx++

jmp cyc1 ; переход на начало цикла

ex: mov ah,8 ; функция 8 - ввод символа без

; отображения на экране

int 21h

mov ax,4c00h ; функция 4Сh - завершение программы

int 21h

.data ; сегмент данных

string db 62 DUP (?) ; буфер для строки

message db "Input String!",0Dh,0Ah,'$' ; строка - сообщение

crlf db 0Dh,0Ah,'$' ; строка - перевод строки

end start

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