键盘输入数字转化成二进制输出到屏幕〔多次调用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中断大全查,我觉得这些中断记住几个常用的就好了,剩下的可以直接查表。我连这几个都忘了,也是查的,嘿嘿