Цель этой программы состоит в том, чтобы перевернуть заданную строку, меняя регистр каждой буквы. Строка не может быть длиннее 20 символов, если ввод длиннее, программа требует от пользователя повторного ввода строки. Программа завершается, когда пользователь вводит «ввод», и программа завершается после печати конечного предложения.
При реализации этого у меня есть 3 проблемы:
Я попытался получить входную строку с помощью вызова ReadString, и, поскольку эта процедура останавливается, когда дается клавиша ввода, консоль замораживается, когда я нажимаю клавишу ввода, чтобы нормально завершить программу. Как я могу исправить свой код, чтобы он печатал завершающее сообщение, а затем нормально завершал программу с возвращаемым значением 0?
Если входная строка длиннее 20 символов, пользователь должен снова ввести строку. Поэтому я написал ja L1. Но по какой-то причине mov bytecount, eax; количество байт cmp, 20; похоже, не может правильно отфильтровать случай. Когда выполняется строка mov bytecount, eax, значение bytecount правильное, но когда программа выполняет следующую строку, cmp bytecount, 20, значение bytecount изменяется. Я не знаю, что я делаю неправильно.
Процедура CaseChange зависает при выполнении, поэтому я предполагаю, что она зацикливается бесконечно, но я не могу найти, какое условие неверно.
.data
MaxLength = 20
prompt3 BYTE "End of program",0
buffer BYTE MaxLength DUP(0)
bytecount DWORD ?
.code
main PROC
call Clrscr
L1: mov edx, OFFSET buffer
mov ecx, SIZEOF buffer
call PromptForInput ; printing input prompt
call ReadString
mov bytecount, eax
cmp bytecount, 20 ;*** get input again if number of characters in the string is greater than 20
ja L1 ;***
call ReverseString
call CaseChange ;***
mov edx, OFFSET buffer
call WriteString ;printing the result
loop L1
mov edx, OFFSET prompt3 ;*** after input <ent> how do I print prompt3?
call WriteString
exit
main ENDP
CaseChange PROC
pushad
mov eax, OFFSET buffer
L1:
mov dl, BYTE PTR[eax]
test dl, dl
jz L3
cmp dl, 'A'
jl L3
xor dl,32
cmp dl,'z'
L2:
inc eax
jmp L1
L3:
popad
ret
CaseChange ENDP
(подсказка ввода): Кошки и собаки.
(подсказка вывода): .SGOd DNA STAc
(подсказка ввода): слишком долго для данного лимита
(подсказка ввода):
Конец программы