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

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  只有不懈的执着追求 才有顿开的惑然释悟
  • 『姓名』:陈振华              
  • 『性别』:男    『发送消息
  • 个人说明:一个平凡人,要做不平凡的事,梦想也好,成功也罢,去努力了,就会留下鲜明的轨迹.
  • 详细信息『加为好友』
最新评论
最新留言
好友圈
文章收藏
友情链接

[2008-02-08 21:15] 推荐博文 键盘输入数字转化成二进制输出到屏幕〔多次调用int21h中断〕

键盘输入数字转化成二进制输出到屏幕〔多次调用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中断大全查,我觉得这些中断记住几个常用的就好了,剩下的可以直接查表。我连这几个都忘了,也是查的,嘿嘿
评论次数(1)  |  浏览次数(620)  |  类型(默认类型) |  收藏此文  | 

[  wdm   发表于  2008-02-09 15:56  ]

呵呵~~

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