【发布时间】:2019-06-29 17:42:12
【问题描述】:
输入应取自 a-z 或 A-Z,输入以星号 * 结束。
我们需要将输入字符的第一个和最后一个大写字母作为输出。此外,我们应该显示我们每次接受的输入。注:我们逐个字符地输入输入,而不是字符串。
测试用例一:输入:aAbCcP* 输出:AP
测试用例 2:输入:ZabCBc* 输出:ZB
我在下面写了这段代码,满足测试用例1,但不满足测试用例2:
.MODEL
.STACK 100H
.DATA
STR DB 'Enter letters:$'
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
LEA DX, STR
MOV AH, 9
INT 21H
cycle:
MOV AH, 1
INT 21H
CMP AL, '*'
JZ output
CMP AL, 'Z'
JA save
head:
CMP BL, 1
JZ save
MOV BL, 1
MOV BH, AL
clear:
XOR AL, AL
save:
MOV CH, AL
LOOP cycle
output:
MOV AH, 2
MOV DL, BH
INT 21H
MOV AH, 2
MOV DL, CH
INT 21H
MAIN ENDP
END MAIN
【问题讨论】:
-
您的代码打印在案例 2 中的作用是什么?这不是minimal reproducible example。还要评论您的代码和/或用英语描述您的算法supposed 是什么,哪些寄存器应该保存什么。当没有任何东西跳到那里时,我不明白为什么你有一个
clear:标签。您只能从head:跌落到那里。此外,您似乎在循环开始之前没有将 BL 或 BX 归零就读取了 BL。您的代码似乎依赖于 BL != 1 进入函数。 -
另外,您的循环会根据 CX 提前结束,否则
loop指令可能会损坏 CH。我想你想要jmp,因为没有基于计数的循环终止条件。loop基本上是dec cx/jnz但没有更新标志,所以显然你不希望那样。 -
无论如何,最明显的问题是,CH 每次循环都总是更新。只有最后一个大写字符也是最后一个整体时,它才能工作。您可能会编写 2 个循环:一个找到第一个大写字母并将其保存在一个寄存器中,然后另一个而不是跟踪最后一次看到的。