С*
Светлана *****

Ассемблер (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

КА
Кирилл Алибаев

Во первых, зарезервируйте переменную для этой строки. В вашей строке String - 23 символа (включая пробелы) . Ну.. допустим зарезервируем чуть побольше. Пусть будет 100:
String db 100 dup (?) ; В этой переменной зарезервировано место, размером в 100 (десятичн. ) байт. В нее будем заносить симовлы нашей строки, которые будем вводить с кл-ры.
Чтобы вводить символы с клавиатуры, воспользуйтесь функцией 1h прерывания 21h:
mov ah,1 ; в ah - номер функции
int 21h ; вызываем прерывание
Эта функция прерывания 21 делает следующее - во первых ожидает нажатия пользователем клавиши. После того, как нажмете, в регистр al занесется код нажатого символа и вместе с этим этот символ выведется на экран.
Ну а дальше, что нибудь такое:
mov di,offset String : Заносим в di адрес начала нашей, пока что пустой переменной.
stosb ; Эта команда занесет код символа из al в первый байт нашей строки. И САМА увеличит di,то. смещение на 1.
Дальше просто, опять жмем клавишу, заносим уже ВО ВТОРОЙ байт (так как команда stosb сама увеличила смещение на 1) второй введенный символ. И т. д. Только не забудьте после последнего символа занести 24h (код $). Дабы после него ничего больше не выводилось, если захотите повторно вывести на экран, уже введенную строку.

АМ
Александр Мачин

Ето тасм а не масм

Похожие вопросы
Переворот строки на ассемблере.
Вставка ассемблера в код C++
Как вводить строку с клавиатуры в языке С? Желательно увидеть пример такой программки.
Изменить код программы Java
Ассемблер. Что делает каждая строка в коде?
Ассемблер. Что делает каждая строка в коде?
кто нибудь может написать программу на ассемблере? Сравнить две ограниченные нулём строки
нужен код на ассемблере
ассемблер, длина строки (код в описании)
Vb разработать программу, которая вводит с клавиатуры 5 строк, и для каждой строки выводит первую и последнюю букву.