Ассемблер (MASM). Как изменить код программы, чтобы можно было вводить строку с клавиатуры?
Программа перемещает в строке пробелы в левую часть и выдаёт на экран их количество, а также модифицированную строку.
Как изменить код программы, чтобы можно было вводить строку с клавиатуры?
Я пытался переделать string в буфер, прописал команды ввода в него, но видимо делаю это как-то не правильно.. .
Кто-нибудь может исправить код на нужный?
Код рабочей программы:
.model small
.486
.stack 20h
.data
privetstvie db 'Введите строку: ',13,10,'$' ;исследуемая строка
string db 'masm1 masm2 masm3 masm4', 13,10,'$'
sCount db 13,10,'Количество пробелов = ','$'
pressanykey db 13,10,'Для завершения нажмите любую клавишу... ','$'
.code
.startup
mov ax, @DATA ;данное макро настраивает сегмент SS и DS
mov es, ax ;надо еще и ES
lea dx, privetstvie ;вывод диалогового окна приветствия
mov ah, 9
int 21h
lea di, string ;исследуемая строка
call MoveSpaces ;переносим пробелы в начало
;получим в cx число пробелов
lea dx, sCount
mov ah, 9 ;выведем количество пробелов
int 21h
mov ax, cx
call PrintNum
mov al, 0dh ;перевод строки
int 29h
mov al, 0ah
int 29h
lea dx, string ;вывод модифицированной строки
mov ah, 9
int 21h
lea dx, pressanykey ;вывод текстового сообщения об
mov ah, 9
int 21h
mov ah,0 ;ожидании нажатия на клавишу
int 16h
mov ax, 4c00h ;завершение программы
int 21h
;раздел процедур
;процедура переноса пробелов
MoveSpaces proc ;переносим пробелы в начало
or cx, -1 ;посчитаем длину строки
mov al, 0dh ;ищем признак конца строки
repne scasb
not cx ;cx = длине строки + 1
lea di,[di-2] ;на позицию последнего символа
mov si,di ;будем писать по адресу [si]
std ;автодекремент
search_loop:
mov al, ' ' ;ищем пробел
repe scasb
jcxz spaces ;cx=0, когда пройдем всю строку
mov al, [di+1] ;найденный "непробел"
mov [si], al ;сдвигаем на правый край
dec si ;на следующий адрес
jmp search_loop ;пока не пройдем строку
spaces: ;пропишем до начала строки пробелами
xor cx, cx ;и посчитаем
;al = ' '
spaces_loop:
cmp si, offset string
jb finish ;сравниваем, прошли ли начало
mov [si], al ;пишем пробел
dec si
inc cx
jmp spaces_loop
finish:
cld ;вернем автоинкремент
ret
MoveSpaces endp ;конец процедуры переноса пробелов
;процедура-счётчик количества пробелов
PrintNum proc ;выводим число из ax
xor cx, cx ;счетчик цифр
mov bx, 10 ;будем делить на 10
PrDiv: ;цикл поиска цифр
xor dx, dx ;подготавливаемся к делению
div bx ;делим dx:ax на 10
push dx ;остаток = очередной цифре
inc cx ;считаем
test ax, ax ;еще есть?
jnz PrDiv
PrOut: ;цикл вывода
pop ax ;извлекаем из стека цифры в обратном порядке
or al, '0' ;0-9 в '0'-'9'
int 29h ;выводим
loop PrOut ;всего cx цифр
ret
PrintNum endp ;окончание процедуры счетчика
end