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

DATASEGMENTSTR1DB'Inputaletter:',0AH,'$'STR2DB0AH,'Youhaveinputeda:',0AH,'$'DATAENDSC... 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

结果输出结果是:
展开
 我来答
百度网友9045b38
2012-11-23 · TA获得超过1972个赞
知道小有建树答主
回答量:984
采纳率:90%
帮助的人:549万
展开全部
;已修改好,问题在于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).
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mrzhanglei1
2012-11-23 · 超过49用户采纳过TA的回答
知道小有建树答主
回答量:101
采纳率:0%
帮助的人:120万
展开全部
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
就行了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式