Архитектура компьютеров / Учебные пособия / Примеры программирования assembler IA-16 / Программа с подпрограммами ввода и вывода строки
.doc.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