自己写了个简单的汇编程序:从键盘输入一个字符,再把它输出到显示器上。 结果错了,请问高手们应该怎样改

DATA SEGMENTSTR1 DB 'Input a letter:',0AH,'$'
STR2 DB 0AH,'You have inputed a:',0AH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,STR1 MOV AH,09H
INT 21H

MOV AH,01H
INT 21H

LEA DX,STR2 MOV AH,09H
INT 21H
MOV DL,AL MOV AH,02H
INT 21H

MOV AH,4CH
INT 21H
CODE ENDS
END START

结果输出结果是:

第1个回答  2012-11-23
;已修改好,问题在于DOS的9号功能调用会破坏先前输入的AL中的值。(见DEBUG调试示例)。
;另外为输出美观,也对DATA段稍做了修改。
;不错,加油!

;自己写了个简单的汇编程序:从键盘输入一个字符,再把它输出到显示器上。
;结果错了,请问高手们应该怎样改 检举|2012-11-22 21:06
;提问者: wentbc |浏览次数:13次DATA SEGMENT

DATA SEGMENTSTR1 DB 'Input a letter:','$'
STR2 DB 0DH,0AH,'You have inputed a:','$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX

LEA DX,STR1
MOV AH,09H
INT 21H

MOV AH,01H
INT 21H
PUSH AX ;保护AX(其实是保存输入的AL)
LEA DX,STR2
MOV AH,09H
INT 21H

POP AX ;恢复AX(其实是恢复AL)
MOV DL,AL
MOV AH,02H
INT 21H

MOV AH,4CH
INT 21H
CODE ENDS
END START
附: debug下验证DOS的9号功能调用会破坏先前输入的AL中的值。
E:\masm>debug
-a
17B8:0100 mov ah,9
17B8:0102 mov al,88
17B8:0104 mov dx,200
17B8:0107 int 21
17B8:0109 nop
17B8:010A
-a200
17B8:0200 db 'Hello$'
17B8:0206
-g109
Hello
AX=0924 BX=0000 CX=0000 DX=0200 SP=FFEE BP=0000 SI=0000 DI=0000
DS=17B8 ES=17B8 SS=17B8 CS=17B8 IP=0109 NV UP EI PL NZ NA PO NC
17B8:0109 90 NOP
-
显然,程序执行后AL的值并不等于88,而是24,所以显示‘$'.("$"的ASCII码=24H).本回答被提问者和网友采纳
第2个回答  2012-11-23
1.问题
LEA DX,STR2
MOV AH,09H
INT 21H

破坏了AL的值,你白输入了
2.改进
PUSH AX ;保护AX
LEA DX,STR2
MOV AH,09H
INT 21H

POP AX ;恢复AX
就行了
相似回答