从MASM中的字符串中删除字符

时间:2013-10-09 03:28:06

标签: string assembly masm irvine32

我必须写一个程序

  • 从键盘缓冲区中取一个字符串并将其放入字符数组
  • 要求删除字符
  • 从角色阵列中移除角色,同时移动其他所有内容

我想使用堆栈来完成此任务。所以这是我的逻辑。

从字符串末尾开始,将该字符与要删除的字符进行比较。如果不是角色将其推入堆栈。如果忽略它并继续通过字符串。然后从头开始将一切都放到位。

我应该用一个程序来完成这个。当我踩到一切似乎工作正常,直到我试图离开程序并返回主要。我很确定我的程序中的逻辑是问题所在。现在,当我尝试使用字符串“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:

它现在按设计工作。我只是有一些格式问题需要清理。

1 个答案:

答案 0 :(得分: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:

它现在按设计工作。我只是有一些格式问题需要清理。