汇编网首页登录博客注册
mouse的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  我要做些我能做的事情,不能老是睡下去了!
  • 『姓名』:;-)               
  • 『性别』:男    『发送消息
  • 个人说明:我的小老鼠;-)
  • 详细信息『加为好友』
学习动态

[2007-12-18 17:11] 推荐博文 键盘输入数字转化成二进制输出到屏幕〔多次调用int21h中断〕

看到下面文章回答的帖子有段代码,分析下~
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中断大全查,我觉得这些中断记住几个常用的就好了,剩下的可以直接查表。我连这几个都忘了,也是查的,嘿嘿
评论次数(6)  |  浏览次数(5065)  |  类型(汇编相关) |  收藏此文  | 

[  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等待输入字符的时候  
系统是怎么等待的?一直在执行空循环?

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码