看到下面文章回答的帖子有段代码,分析下~
BIOS和DOS中断大全:http://www.asmedu.net/blog/user/postcontent.jsp?neighborId=4526&kindLevel=1&kindId=4140&postId=6505
DATA SEGMENT
INP DB 'PLEASE INPUT A DIGIT(0~9):$'
DATA ENDS
ASSUME CS: CODE,DS: DATA
CODE SEGMENT
BEGIN: MOV AX,DATA
MOV DS,AX
MOV AH,9
LEA DX,INP
INT 21H
MOV AH,1
INT 21H
MOV BL,AL
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
INT 21H
MOV CX,8
LOP: SHL BL,1
MOV DL,30H
ADC DL,0
MOV AH,2
INT 21H
DEC CX
JNZ LOP
MOV DL,'B'
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
---------------------
一看里面好几个中断,其实也没什么,中断也可以看成自己编写的几个子程序。
运行了一下,不知道实现的是什么功能,在看下代码一对照结果,原来是要把输入的0~9数字,以二进制显示出来。
程序错误原因:通过中断21h的ah=1,得到的是数字的ASCII码,所以应该减去30H再开始循环。所以增加sub al,30h。
所以代码变为:
ASSUME CS: CODE,DS: DATA;看习惯王老师的书,还是拿出来顺眼,反正也不影响程序编译
DATA SEGMENT
INP DB 'PLEASE INPUT A DIGIT(0~9):$'
DATA ENDS
CODE SEGMENT
BEGIN: MOV AX,DATA
MOV DS,AX
MOV AH,9 ;09H —显示字符串
;入口参数:AH=09H
;DS:DX=待输出字符的地址
;说明:待显示的字符串以’$’作为其结束标志
;出口参数:无
LEA DX,INP
INT 21H ;即显示字符串
MOV AH,1 ;01H、07H和08H —从标准输入设备输入字符
;入口参数:AH=01H,过滤掉控制字符,并回显
;出口参数:AL=输入字符的ASCII码
INT 21H ;即从键盘得到一个字符,并由al存放ASCII码
sub al,30h;数字的ASCII码-30H=数字的值<-----我增加的
MOV BL,AL ;把从数字存放在bl中,做为循环使用
MOV DL,0DH;给dl赋值od(ASII码->carriage return换行)
MOV AH,2 ;02H —字符输出
;入口参数:AH=02H
;DL=待输出字符的ASCII码
;出口参数:无
INT 21H ;输出dl中的值
MOV DL,0AH;给dl赋值,此时ah=2(ASII码OA->line feed回车)
INT 21H
MOV CX,8 ;循环8次,输出8位数值
LOP: SHL BL,1 ;左移
MOV DL,30H
ADC DL,0 ;得到移出的位,不懂的可以看看第十一章内容。
MOV AH,2 ;02H —字符输出
INT 21H
DEC CX
JNZ LOP
MOV DL,'B'
MOV AH,2 ;02H —字符输出
INT 21H
MOV AH,4CH;4CH —带返回码方式的终止进程
;入口参数:AH=4CH
;AL=返回的代码
;出口参数:无
INT 21H
CODE ENDS
END BEGIN
上面用到了int 21h的ah=1 ah=2 ah=4c ah=9中断,内容可以去上面的BIOS和DOS中断大全查,我觉得这些中断记住几个常用的就好了,剩下的可以直接查表。我连这几个都忘了,也是查的,嘿嘿
- [ltp1234] push cx add si,1 ;结果的数字个数 04/09 01:58
- [ltp1234] 写的很好!! 04/08 23:48
- [游客] 我也不知道说些什么 挺一下好啦 04/03 20:50
- [e56004474] 没事的话,别坐电车。 据说。。。 03/17 18:52
- [waasmedu] 拜读!受教!! 12/21 11:18
- [chinatree] 不错,顶。 12/05 03:32
- [ljl] 晕,最后一题也没有想到。。。 12/04 14:56
- [mouse] 楼上的看错了,填空位置填inc cx,就是为了找到第一个值为0的byte 07/29 15:37
- [wbkyh] 检测点9.2中,loop s指令有问题,该指令执行后,cx=cx-1,如果cx=0,则循环结束,也就 06/28 09:32
- [游客] 结果是1,*p取得的是a的地址中的内容,也就是a的值 06/08 00:22
- [lp1989] 请教一道题: 在数据段BUF下开始已定义了信息“I LIKE IBM-PC”, 编写在屏 幕上显 12/29 13:32
- [fangaiyisheng] 飘过,很好 ,很强大! 06/18 06:05
- [游客] [ lyh1984 发表于 2009-06-26 10:39 ] 请问一下,我用DEB 07/15 10:59
- [lyh1984] 请问一下,我用DEBUG为什么调不出字符串呢?我想知道你们是怎么调的,是用CMD DEBUG吗? 06/26 10:39
- [q470393267] 我看你头像半天了,那猫和老鼠能抗啊都没有死~ 05/05 21:31
- [fangyugirl] 经过上机DEBUG,我已经知道问题在哪里了,谢谢你呀。 04/09 10:31
- [fangyugirl] 我是想问你第10章的第三个子程序,这个子程序我现在主要的问题是12666/10会产生溢出,所以我调用 04/09 09:57
- [mouse] [ wangping198611 发表于 2009-03-23 11:43 ] 03/31 10:28
- [mouse] miaozaoyang 发表于 2009-03-29 22:31 ] [ 删除留 03/31 10:23
- [miaozaoyang] 又得问你个问题了,不知道为什么,实验15 不能够正常进行,程序应该是没有任何问题的,还是操作系统的问 03/29 22:31
[ happy 发表于 2007-12-18 20:23 ]
ASSUME CS: CODE,DS: DATA;看习惯王老师的书,还是拿出来顺眼,反正也不影响程序编译
------------------------
The same to you!
[ Wednesday 发表于 2007-12-18 21:34 ]
帖子不错!
[ huibian 发表于 2007-12-19 08:30 ]
分析的不错
[ 游客 发表于 2007-12-20 16:43 ]
调用中断也就是调用别人的子程序,支持这个观点,楼主分析的例子虽然也很简单,但是说明了这个问题,顶下
[ 游客 发表于 2008-01-02 10:20 ]
不错呵呵
[ wu136626 发表于 2009-09-02 23:37 ]
学习了 很不错!
不过有个疑问是调用ah=1等待输入字符的时候
系统是怎么等待的?一直在执行空循环?