第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
就行了