【问题标题】:Removing a character from a string in MASM从 MASM 中的字符串中删除一个字符
【发布时间】:2013-10-09 03:28:05
【问题描述】:

我必须写一个程序

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

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

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

我应该使用一个程序来完成这个。当我逐步完成时,一切似乎都正常,直到我尝试离开程序并返回主程序。我相当确定我的程序中的逻辑是问题所在。现在,当我尝试使用字符串“The”并删除 e 时,我得到了“he”。

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:

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

【问题讨论】:

  • 将答案添加为答案,而不是作为问题的编辑。
  • 是的,但作为一个新用户,堆栈溢出不会让我在发布后这么快回答我自己的问题。

标签: string assembly masm irvine32


【解决方案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:

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

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2016-06-24
    • 2023-01-28
    • 2013-03-02
    相关资源
    最近更新 更多