Я должен написать программу, котораяУдаление символа из строки в MASM
- принимает строку из буфера ключей платы и помещает его в массив символов
- запрашивают символ для удаления
- удаляет символ из массива символов, перемещая все остальное на
Я хочу использовать стек, чтобы выполнить это. Итак, вот моя логика.
Начиная с конца строки сравнивайте этот символ с символом, который необходимо удалить. Если это не символ, нажмите его в стек. Если он игнорирует его и перемещается по строке. Затем, начиная с самого начала, всплывают все на своем месте.
Я должен использовать процедуру, чтобы выполнить это. Когда я перехожу через все, кажется, работает нормально, пока я не попытаюсь оставить процедуру и вернуться к основному. Я уверен, что моя логика в моей процедуре - проблема. Прямо сейчас, когда я пытаюсь работать со строкой «The» и удалять e, я получаю «он».
TITLE String Manipulation
INCLUDE Irvine32.inc
.data
prompt byte "Please enter a string to manipulate : ",0
prompt2 byte "Please enter a character to remove: ",0
answerMSG byte "The new string is: ",0
string BYTE 51 DUP (0)
char BYTE ?
byteCount dword ?
.code
main PROC
call clrscr
push eax ;perserve the registers
push ecx
push edx
mov edx, OFFSET prompt ;prints the prompt
call writeString
mov edx, OFFSET string ;moves the register to the first location for the string
mov ecx, SIZEOF string ;Sets the max characters
call readString
mov byteCount,eax ;places actual count into a counting register
call crlf
mov edx, OFFSET prompt2 ;prints the prompt
call writeString
mov edx, OFFSET char
mov ecx, 1
call readString
call clrscr
mov ecx, byteCount
mov edx, OFFSET string
call stringMan
mov edx, OFFSET string
call writeString
pop edx
pop ecx
pop eax
main ENDP
;
stringMan PROC USES eax ecx edx
mov eax,0
L1:
movzx edx , string[ecx]
cmp dl, char
jz L2
push edx
inc eax
L2:
mov string[ecx],0
LOOP L1
mov ecx,eax
mov eax,0
L3:
pop edx
mov byte ptr string[eax],dl
inc eax
loop L3
ret
stringMan ENDP
END main
Обдумал это.
Ответ:
я не имел дело с получением символа из консоли правильно. Я также не имел дело с случаем, когда ecx = 0. Это первая позиция массива символов. Поэтому я не сравнивал правильный символ и не нажимал первый символ на массив, когда это было необходимо. Я установил ее, удалив
mov edx, OFFSET char
mov ecx, 1
call readString
и заменить его
call readChar
mov char,al
затем добавить это после того, как петли L1.
movzx edx , string[ecx]
cmp dl,char
jz L4
push edx
inc eax
L4:
Теперь он работает так, как он был разработан. У меня просто есть некоторые проблемы с форматированием.
Добавить ответ в качестве ответа, а не как отредактировать вопрос. – hjpotter92
Да, я бы, но, будучи новым пользователем, переполнение стека не позволяло мне отвечать на свой вопрос так скоро после публикации. –