2013-10-09 3 views
2

Я должен написать программу, котораяУдаление символа из строки в 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: 

Теперь он работает так, как он был разработан. У меня просто есть некоторые проблемы с форматированием.

+0

Добавить ответ в качестве ответа, а не как отредактировать вопрос. – hjpotter92

+1

Да, я бы, но, будучи новым пользователем, переполнение стека не позволяло мне отвечать на свой вопрос так скоро после публикации. –

ответ

1

Ответ:

я не имел дело с получением символа из консоли правильно. Я также не имел дело с случаем, когда 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: 

Теперь он работает так, как он был разработан. У меня просто есть некоторые проблемы с форматированием.

Смежные вопросы