Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архитектура компьютеров / Учебные пособия / Примеры программирования assembler IA-16 / Программа с подпрограммами ввода и вывода строки

.doc
Скачиваний:
42
Добавлен:
20.03.2015
Размер:
49.66 Кб
Скачать

.model small ; модель памяти, используемая для ЕХЕ

.stack 100h ; сегмент стека размером в 256 байт

.code

start: mov ax,@data ; сегментный адрес строки message

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

mov dx,offset promt ; в регистр dx помещается адрес "приглашения к вводу"

mov ah,9 ; функция DOS "вывод строки приглашения к вводу"

int 21h ; вывод "приглашения на экран"

mov dx, offset input_buffer ; в регистр dx помещается адрес буфера для ввода

mov ah,0Ah ; функция DOS "ввод строки"

int 21h ; разрешен ввод с клавиатуры"

; *********** визуализируем введенную строку

; формируем параметры для подпрограммы визуализации введенной строки

push dx ; сохраняем в стеке адрес буфера ввода

mov dx, offset header ; сохраняем в стеке адрес заголовка для строки вывода

push dx

push offset length_str ; сохраняем в стеке длину строки ввода

mov dx, offset entered_str ; сохраняем в стеке адрес строки вывода

push dx

; *********** вызываем подпрограмму визуализации введенной строки

call outstr

mov ax,4C00h ; функция DOS "завершить программу"

int 21h ; выходим из программы

; *********** подпрограмма визуализации введенной строки

outstr: push bp

mov bp,sp

push ax

push bx

push dx

push si

; ********** формируем заголовок строки вывода введенной строки

; формируем визуализацию длинны введенной строки

xor si,si

mov bx, [bp+8]

xor cx,cx

mov cl,10

mov al, [bp+6] ; помещаем в cl длину введенной строки

formleng: div cl

add dl,30h

mov [bx-si+34],dl

inc si

cmp al,0

jnz formleng

mov dx,bx

mov ah,9 ; функция DOS "вывод строки «Заголовок»"

int 21h

;*********** вызываем подпрограмму переноса символов строки в выходной буфер

call outform

pop si

pop dx

pop bx

pop ax

pop bp

ret

; *********** подпрограмма переноса по символьно в выходной буфер введенную строку

outform: push bp

mov bp,sp

push ax

push bx

push dx

push si

xor si,si

mov cx, [bp+18]

; переносим по символьно в выходной буфер введенную строку

lp: mov bx, [bp+22]

mov al,[bx+si+2]

mov bx, [bp+16]

mov [bx+si],al

inc si

loop lp

mov al,'$' ; записываем символ окончания вывода

mov [bx+si],al

mov dx,offset entered_str ; выводим строку ввода

mov ah,9

int 21h

mov dx,offset end_str ; переводим курсор на новую строку

mov ah,9

int 21h

pop si

pop dx

pop bx

pop ax

pop bp

ret

; ****** сегмент данных

.data

promt db "Введите строку",0Dh,0Ah,'$'

header db "Введена следующая строка длинной символов",0Dh,0Ah,'$'

entered_str db 80 dup(" "),0Dh,0Ah,'$' ;буфер для вывода строка

end_str db 0Dh,0Ah,'$'

;************* буфер ввода

input_buffer db 80

length_str db 0

end start