1

必须制作一个汇编程序,从键盘输入任意字母数字序列,直到按“ESC”并以相反的顺序打印插入的序列,但没有数字。

例如:“Acd1fop67klm2xwz”->“zwxmlkpofdcA”

我现在做了这个:

MAX     EQU     20
BUF     DB      MAX DUP(?)    

SUB AH,AH
       INT 16H
       CMP AH,1
       JE  ;end of entering

 MOV BX,OFFSET BUF
       SUB DI,DI  


GETCH:  ...
       MOV [BX+DI],AL
       INC DI
       CMP DI,MAX
       JNE GETCH        

PREV:   DEC DI
       JS  KRAI
       MOV AL,[BX+DI]
       CMP AL,30H
       JB  NODIG
       CMP AL,39H
       JBE PREV
NODIG:; show symbols
       JMP PREV
KRAI:  ;ends the program 
4

1 回答 1

0

首先,你有你的缓冲区,CPU 将尝试执行它。您可能希望将其放在单独的数据段中(初始化ds!)...或将其放在最后。

当您到达 时jne getch,您可能想一直回到您实际从键盘获得另一个字符的位置。但是你初始化bxdi在那之后。您可能希望在主输入循环之前执行此操作。

当您到达“显示符号”标签时,您可能想要实际执行此操作。int 29h是一种快速而肮脏的方式来打印字符al而没有副作用。它被记录为“供内部使用”,因此您可能想要使用另一种方法(int 29h不能重定向到另一个文件)。

当你走到尽头(KRAI:)时,你实际上需要退出。“退出”是每个程序都需要做的事情,所以你可能应该先学会这样做!

一般来说,你在正确的轨道上——继续努力。你跳过数字的逻辑对我来说看起来不错,并且不重新发明的荣誉gets()!调试器可能会有所帮助,但一旦你让它输出一些东西,你可能会看到哪里出了问题(如果有的话)。

于 2013-06-27T04:26:27.943 回答