这是我到目前为止的工作
.DATA
LF EQU 10
String_prompt DB "Enter a character string: ",0
Is_palindrome DB "The string is a palindrome.",0
Not_palindrome DB "The string is not a palindrome.",0
.UDATA
user_input resb 80
strip_input resb 80
.CODE
.STARTUP
; Set up ES register
mov AX, DS
mov ES, AX
try_again:
GetStr user_input
cmp user_input, LF
je try_again
mov EDX, user_input
call string_convert
.EXIT
;********************************************
; string_convert: Eliminate blanks and
; punctuation. Convert to upper case
;
;********************************************
string_convert:
enter 0, 0
xor EBX, EBX
mov ECX, 80
read:
mov AL, [EDX+EBX]
cmp AL, '0'
jl skip
cmp AL, '9'
jg check
check:
sub AL, 20H
cmp AL, 'A'
jl skip
cmp AL, 'Z'
jle write
cmp AL, 5BH :check for ASCII past 'Z'
jge skip
skip:
inc EBX
jmp read
write:
push AX
push ECX
les EDI, user_input
mov ECX, 80
cld
mov AL, 0
repne scasb
leave
ret
我已经了解了如何检查反向字符串的基本概念,使用堆栈来反转它但我还挂了如何将这些字符写入新字符串strip_input
有没有办法将未初始化的字符串与单个字符连接?我想要做的是删除所有标点符号和数字的user_input
,同时将所有字符转换为大写。我认为我的检查设置正确,但我坚持write:
程序。
还有一种更好的方法来读取用户的输入而不是只接受80个字符吗?我觉得这会导致问题,如果它是一个回文,因为所有的空白区域。
所以我得到它大部分输出,这就是我现在的位置,我似乎在第一次函数调用后得到错误
LF EQU 10
String_prompt DB "Enter a character string: ",0
Is_palindrome DB "The string is a palindrome.",0
Not_palindrome DB "The string is not a palindrome.",0
index DB 0
.UDATA
user_input resb 80
strip_input resb 80
final_input resb 80
.CODE
.STARTUP
; Set up ES register
mov AX, DS
mov ES, AX
try_again:
PutStr String_prompt
GetStr user_input
cmp word[user_input], LF
je try_again
call string_convert
call string_reverse
call palindrome_check
PutStr user_input
PutStr strip_input
PutStr final_input
cmp EAX, 1
jne notP
PutStr Is_palindrome
notP:
PutStr Not_palindrome
.EXIT
;********************************************
; string_convert: Eliminate blanks and
; punctuation. Convert to upper case
;
;********************************************
string_convert:
enter 0, 0
xor EBX, EBX
mov ECX, 80
read:
cmp ECX, 0
jz endread
mov AL, byte [user_input+EBX]
cmp AL, '9'
jle skip
cmp AL, 7BH
jge skip
check:
inc EBX
or AL, 20H
cmp AL, 'a'
jl skip
cmp AL, 'z'
jle write
skip:
inc EBX
loop read
write:
;PutCh AL
push EBX
mov EBX, [index]
mov byte [strip_input+EBX], AL
inc EBX
mov [index], EBX
pop EBX
loop read
endread:
leave
ret
;*********************************************
; string_reverse: Recursive procedure to
; reverse string
;
;
;*********************************************
string_reverse:
enter 0,0
xor EBX, EBX
xor EAX, EAX
push 0
checknull:
mov AL, byte [strip_input+EBX]
PutCh AL
cmp AL, 0
je reverse
ret
pushtostack:
push AX
inc EBX
call checknull
reverse:
xor EBX, EBX
pop AX
cmp AL, 0
je end
mov byte [final_input+EBX],AL
inc EBX
jmp reverse
end:
leave
ret
;************************************************
;palindrome check: Check for palindrome
;
;************************************************
palindrome_check:
enter 0,0
push ECX
push EDI
push ESI
push DS
push ES
les EDI, [strip_input]
mov EDX, 80
lds ESI, [final_input]
cld
repe cmpsb
je same
xor EAX, EAX
same:
mov EAX, 1
leave
ret
C-prompt刚崩溃
所以现在我把这个问题减少了一些,不确定这是怎么回事,但是EBX正在增加2?
string_reverse:
enter 0,0
xor EBX, EBX
xor EAX, EAX
xor ECX, ECX
push 00h
checknull:
mov AL, byte [strip_input+EBX]
PutLInt EBX
inc EBX
PutCh AL
cmp AL, 00h
jne pushtostack
ret
pushtostack:
push AX
PutLInt EBX
;inc EBX
call checknull
reverse:
pop AX
cmp AL, 00h
je end
mov byte [final_input+ECX],AL
inc ECX
jmp SHORT reverse
end:
leave
ret
一旦完成strip_input
的循环,它就会崩溃,我认为它涉及到ret
的{{1}}
所以现在唯一的问题是比较2个字符串reverse:
和strip_input
我真的不知道怎么做才能有人帮助我?