一个汇编的小问题
DATASSEGMENTMESS1DB'PLEASEINPUTALETTER:','$'MESS2DB'THETHREELETTERSARE:','$'ENTERDB13...
DATAS SEGMENT
MESS1 DB 'PLEASE INPUT A LETTER:','$'
MESS2 DB 'THE THREE LETTERS ARE:','$'
ENTER DB 13,10,'$'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
LEA DX,ENTER
MOV AH,09H
INT 21H
LEA DX,MESS2
MOV AH,09H
INT 21H
DEC AL ;得到前导字符
MOV DL,AL ;准备显示三个字符
MOV CX,3
DISPLAY:
MOV AH,2;显示一个字符的DOS调用
INT 21H
INC DL
LOOP DISPLAY
MOV AH,4CH
INT 21H
CODES ENDS
END START
各位大虾,帮帮忙,我这个不知道哪里出问题了,老是打印#$%
题目是要求:输入一个字母,打出包括它和它的前后2个字母。 展开
MESS1 DB 'PLEASE INPUT A LETTER:','$'
MESS2 DB 'THE THREE LETTERS ARE:','$'
ENTER DB 13,10,'$'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
LEA DX,ENTER
MOV AH,09H
INT 21H
LEA DX,MESS2
MOV AH,09H
INT 21H
DEC AL ;得到前导字符
MOV DL,AL ;准备显示三个字符
MOV CX,3
DISPLAY:
MOV AH,2;显示一个字符的DOS调用
INT 21H
INC DL
LOOP DISPLAY
MOV AH,4CH
INT 21H
CODES ENDS
END START
各位大虾,帮帮忙,我这个不知道哪里出问题了,老是打印#$%
题目是要求:输入一个字母,打出包括它和它的前后2个字母。 展开
展开全部
代码修改如下(注意注释):
;输入一个字母,打出包括它和它的前后2个字母。
DATAS SEGMENT
MESS1 DB 'PLEASE INPUT A LETTER:','$'
MESS2 DB 'THE THREE LETTERS ARE:','$'
MESS3 DB 13,10,'$' ;貌似不能用ENTER命名变量,它好像是个指令吧
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H ;这一步执行完后就应该保存AL了
MOV BL,AL ;增加一步保存AL的值
LEA DX,MESS3
MOV AH,09H
INT 21H ;这一步执行完AL的值会改变
LEA DX,MESS2
MOV AH,09H
INT 21H
DEC BL ;得到前导字符
MOV DL,BL ;准备显示三个字符
MOV CX,3
DISPLAY:
MOV AH,2;显示一个字符的DOS调用
INT 21H
INC DL
LOOP DISPLAY
MOV AH,4CH
INT 21H
CODES ENDS
END START
总结:暂时还没太明白你的题目要求。如果要求输入一个拉丁字母,那么要判断输入字符是否在‘A’~‘Z’之间,还要区分一下大小写。如果前导字符和后继字符指的就是ASCII码字符的话,你这样的思路就可以;但是如果要求前导字符和后继字符必须也是拉丁字母的话,那还要加几个判断。这些对楼主来说应该不成问题吧。
楼主在这里提的核心问题,其症结就在于,调用了21H的9号功能后,尽管无返回参数,但是AL的值是会变的,楼主可以调试看一下。
;输入一个字母,打出包括它和它的前后2个字母。
DATAS SEGMENT
MESS1 DB 'PLEASE INPUT A LETTER:','$'
MESS2 DB 'THE THREE LETTERS ARE:','$'
MESS3 DB 13,10,'$' ;貌似不能用ENTER命名变量,它好像是个指令吧
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,MESS1
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H ;这一步执行完后就应该保存AL了
MOV BL,AL ;增加一步保存AL的值
LEA DX,MESS3
MOV AH,09H
INT 21H ;这一步执行完AL的值会改变
LEA DX,MESS2
MOV AH,09H
INT 21H
DEC BL ;得到前导字符
MOV DL,BL ;准备显示三个字符
MOV CX,3
DISPLAY:
MOV AH,2;显示一个字符的DOS调用
INT 21H
INC DL
LOOP DISPLAY
MOV AH,4CH
INT 21H
CODES ENDS
END START
总结:暂时还没太明白你的题目要求。如果要求输入一个拉丁字母,那么要判断输入字符是否在‘A’~‘Z’之间,还要区分一下大小写。如果前导字符和后继字符指的就是ASCII码字符的话,你这样的思路就可以;但是如果要求前导字符和后继字符必须也是拉丁字母的话,那还要加几个判断。这些对楼主来说应该不成问题吧。
楼主在这里提的核心问题,其症结就在于,调用了21H的9号功能后,尽管无返回参数,但是AL的值是会变的,楼主可以调试看一下。
展开全部
本人最近在看王爽的汇编语言,在该书的2.8小节“段的概念”里面有这么一段叙述:“地址10000H~100FFH的内存单元组成一个段,该段的起始地址(基础地址)为10000H,段地址为1000H,大小为100H;
我们也可以认为地址10000H~1007FH、10080H~100FFH的内存单元组成两个段,
它们的起始地址(基础地址)为:10000H和100080H,段地址为:1000H和1008H,大小都为80H。”
这些段地址的长度可以根据公式算出来,但是其段地址的大小100H和80H又是根据怎么计算出来的呢?
希望各路高手帮我详细解答一下,在下将感激不尽!
问题补充:
是用10000H-1007F吗?
2008-09-06
16:16
请高手回答详细点,我是初学者!
2008-09-06
16:18
请高手回答尽量详细,我是初学者!!怕看不懂!
2008-09-06
16:20
10000H—1007F=80H?好像不对哦。
2008-09-06
16:35
一撮·贡米~`
回答:2
人气:1
提问时间:2008-09-06
16:13检举
答案
第一段:10000H-1007FH。大小为80H(后面减前面)
第二段:同上。。
安笛/jk
回答采纳率:43.7%
2008-09-06
16:33
检举
是
10000H-1007F出来的。
只对你有感觉
回答采纳率:8.1%
2008-09-06
16:41
检举
我们也可以认为地址10000H~1007FH、10080H~100FFH的内存单元组成两个段,
它们的起始地址(基础地址)为:10000H和100080H,段地址为:1000H和1008H,大小都为80H。”
这些段地址的长度可以根据公式算出来,但是其段地址的大小100H和80H又是根据怎么计算出来的呢?
希望各路高手帮我详细解答一下,在下将感激不尽!
问题补充:
是用10000H-1007F吗?
2008-09-06
16:16
请高手回答详细点,我是初学者!
2008-09-06
16:18
请高手回答尽量详细,我是初学者!!怕看不懂!
2008-09-06
16:20
10000H—1007F=80H?好像不对哦。
2008-09-06
16:35
一撮·贡米~`
回答:2
人气:1
提问时间:2008-09-06
16:13检举
答案
第一段:10000H-1007FH。大小为80H(后面减前面)
第二段:同上。。
安笛/jk
回答采纳率:43.7%
2008-09-06
16:33
检举
是
10000H-1007F出来的。
只对你有感觉
回答采纳率:8.1%
2008-09-06
16:41
检举
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
哈哈,我用过,大概如下所示
MOV
AH,2
INT
1AH
;INT
1AH
子功能
02
读取系统时钟,返回CH/CL/DH=BCD码小时/BCD码分钟/BCD码秒
下面子程序实现转换的
SHOWBYTE
PROC
NEAR
;BCD值显示子程序,BCD值在BH中
PUSH
BX
;压栈BX值,以防冲掉
MOV
CL,4
;以下代码BH中BCD十位值转ASCLL码
MOV
AL,BH
SHR
AL,CL
ADD
AL,30H
CALL
SHOW
;调用子程序显示AL,当前AL为时间值十位上的数值
CALL
CURMOVE
;调用子程序后移光标
POP
BX
;还原BX值
MOV
AL,BH
;以下代码BH中BCD个位值转ASCLL码
AND
AL,0FH
ADD
AL,30H
CALL
SHOW
;调用子程序显示AL,当前AL为时间值个位上的数值
CALL
CURMOVE
;调用子程序后移光标
RET
SHOWBYTE
ENDP
MOV
AH,2
INT
1AH
;INT
1AH
子功能
02
读取系统时钟,返回CH/CL/DH=BCD码小时/BCD码分钟/BCD码秒
下面子程序实现转换的
SHOWBYTE
PROC
NEAR
;BCD值显示子程序,BCD值在BH中
PUSH
BX
;压栈BX值,以防冲掉
MOV
CL,4
;以下代码BH中BCD十位值转ASCLL码
MOV
AL,BH
SHR
AL,CL
ADD
AL,30H
CALL
SHOW
;调用子程序显示AL,当前AL为时间值十位上的数值
CALL
CURMOVE
;调用子程序后移光标
POP
BX
;还原BX值
MOV
AL,BH
;以下代码BH中BCD个位值转ASCLL码
AND
AL,0FH
ADD
AL,30H
CALL
SHOW
;调用子程序显示AL,当前AL为时间值个位上的数值
CALL
CURMOVE
;调用子程序后移光标
RET
SHOWBYTE
ENDP
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询