2

我必须编写一个程序

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

我想用一个堆栈来完成这个。所以这是我的逻辑。

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

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

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

4

1 回答 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:

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

于 2013-10-23T02:09:26.567 回答