中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-18 12:43
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,270 会员排行
DOS批处理 & 脚本技术(批处理室) » 通过大家努力,批处理可告别choice
可打印版本  16,561 / 45
第1楼 wangff 发表于 2008-12-09 11:37
初级用户 发帖 54 积分 134
通过大家努力,批处理可告别choice
改进版在26楼:
大家共同改进!



[ Last edited by wangff on 2008-12-11 at 10:34 ]
第2楼 wangff 发表于 2008-12-09 16:09
初级用户 发帖 54 积分 134


[ Last edited by wangff on 2008-12-10 at 21:35 ]
第3楼 s11ss 发表于 2008-12-09 19:33
银牌会员 发帖 566 积分 2,098
wangff兄可不可以讲解下int 16的1号功能是怎么用的?
第4楼 wangff 发表于 2008-12-09 20:58
初级用户 发帖 54 积分 134
键盘服务(Keyboard Service——INT 16H)
作者:佚名 出处:中国自学编程网收集整理 发布日期:2007-09-27

00H、10H —从键盘读入字符03H —设置重复率
01H、11H —读取键盘状态04H —设置键盘点击
02H, 12H —读取键盘标志05H —字符及其扫描码进栈
(1)、功能00H和10H
功能描述:从键盘读入字符
入口参数:AH=00H——读键盘
=10H——读扩展键盘,可根据0000:0496H单元的内容判断:扩展键盘是否有效
出口参数:AH=键盘的扫描码
AL=字符的ASCII码
(2)、功能01H和11H
功能描述:读取键盘状态
入口参数:AH=01H——检查普通键盘
=11H——检查扩展键盘
出口参数:ZF=1——无字符输入,否则,AH=键盘的扫描码,AL=ASCII码。
(3)、功能02H和12H
功能描述:读取键盘标志
入口参数:AH=02H——普通键盘的移位标志
=12H——扩展键盘的移位标志
出口参数:AL=键盘标志(02H和12H都有效),其各位之值为1时的含义如下: 位7—INS开状态位3—ALT键按下
位6—CAPS LOCK开状态位2—CTRL键按下
位5—NUM LOCK开状态位1—左SHIFT键按下
位4—SCROLL LOCK开状态位0—右SHIFT键按下
AH=扩展键盘的标志(12H有效),其各位之值为1时的含义如下:
位7—SysReq键按下位3—右ALT键按下
位6—CAPS LOCK键按下位2—右CTRL键按下
位5—NUM LOCK键按下位1—左ALT键按下
位4—SCROLL键按下位0—左CTRL键按下
(4)、功能03H
功能描述:设置重复率
入口参数:AH=03H 对于PC/AT和PS/2:AL=05H
BH=重复延迟
BL=重复率
对于PCjr:AL=00H——装入缺省的速率和延迟
=01H——增加初始延迟
=02H——重复频率降低一半
=03H——增加延迟和降低一半重复频率
=04H——关闭键盘重复功能
出口参数:无
(5)、功能04H
功能描述:设置键盘点击
入口参数:AH=04H AL=00H——关闭键盘点击功能
=01H——打开键盘点击功能
出口参数:无
(6)、功能05H
功能描述:字符及其扫描码进栈
入口参数:AH=05H
CH=字符的描述码
CL=字符的ASCII码
出口参数:CF=1——操作成功,AL=00H,否则,AL=01H
第5楼 s11ss 发表于 2008-12-09 21:04
银牌会员 发帖 566 积分 2,098
不好意思,这不算讲解吧?至少给一两个例子说明下嘛:)
第6楼 wangff 发表于 2008-12-09 21:28
初级用户 发帖 54 积分 134
(2)、功能01H
功能描述:读取键盘状态
入口参数:AH=01H——检查普通键盘
出口参数:ZF=1——无字符输入,否则,AH=键盘的扫描码,AL=ASCII码。



不知说清楚否?打字很慢,请谅解.
第7楼 s11ss 发表于 2008-12-09 22:03
银牌会员 发帖 566 积分 2,098
mov ah,0
int 16

上面两句不就是读输入么,还要1号功能干什么?
第8楼 wangff 发表于 2008-12-09 22:15
初级用户 发帖 54 积分 134
Originally posted by s11ss at 2008-12-9 22:03:
mov ah,0
int 16

上面两句不就是读输入么,还要1号功能干什么?



ah=0: 是等待输入 ah=1: 只检测,不读取(还在键盘缓冲中),如有输入还必须用ah=0读出

[ Last edited by wangff on 2008-12-9 at 22:17 ]
第9楼 s11ss 发表于 2008-12-09 22:20
银牌会员 发帖 566 积分 2,098
Originally posted by wangff at 2008-12-9 10:15 PM:



ah=0: 是等待输入 ah=1: 只检测,不读取(还在键盘缓冲中),如有输入还必须用ah=0读出

[ Last edited by wangff on 2008-12-9 at 22:17 ]




C:\>debug
-a
0B22:0100 mov ah,0
0B22:0102 int 16
0B22:0104
-t

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B22 ES=0B22 SS=0B22 CS=0B22 IP=0102 NV UP EI PL NZ NA PO NC
0B22:0102 CD16 INT 16
-p
(此处输入的是a)
AX=1E61 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B22 ES=0B22 SS=0B22 CS=0B22 IP=0104 NV UP EI PL NZ NA PO NC
0B22:0104 381C CMP ,BL DS:0000=CD
-

我还是觉得用0号就行了

[ Last edited by s11ss on 2008-12-9 at 22:22 ]
第10楼 wangff 发表于 2008-12-09 22:36
初级用户 发帖 54 积分 134
2楼的例子:
inc i ::有参数(任意)等待输入一个字符,通过errorlevel返回

就只用了ah=0

而:
inc ::无参数检测是否有按键 无:errorlevel=0 有errorlevel=键值 可用干运行中动态检测按键

则必须用到 ah=1
第11楼 s11ss 发表于 2008-12-09 22:48
银牌会员 发帖 566 积分 2,098
Originally posted by wangff at 2008-12-9 10:36 PM:
2楼的例子:
inc i ::有参数(任意)等待输入一个字符,通过errorlevel返回

就只用了ah=0

而:
inc ::无参数检测是否有按键 无:errorlevel=0 有errorlevel=键值 可用干运行中动态检测按键

则必须用到 ah=1


无按键是直接回车的情况么?如果只用0号的话,al是0d啊
第12楼 wangff 发表于 2008-12-09 23:02
初级用户 发帖 54 积分 134



这个例子就可说明,只用ah=0做不到这种效果

[ Last edited by wangff on 2008-12-9 at 23:06 ]
第13楼 s11ss 发表于 2008-12-09 23:30
银牌会员 发帖 566 积分 2,098
我慢慢体会吧,有劳了,wangff兄
第14楼 s11ss 发表于 2008-12-09 23:59
银牌会员 发帖 566 积分 2,098
二楼的ecs:100 A0 5D 00 3C 20 75 09 B4 01 CD 16 B8 00 00 74 02 CD 16 B4 4C CD 21 CD 21 CD 21中,3次int 21,何故?
第15楼 wangff 发表于 2008-12-10 08:22
初级用户 发帖 54 积分 134
Originally posted by s11ss at 2008-12-9 23:59:
二楼的ecs:100 A0 5D 00 3C 20 75 09 B4 01 CD 16 B8 00 00 74 02 CD 16 B4 4C CD 21 CD 21 CD 21中,3次int 21,何故?


谢谢s11ss的细心,是从debug考下多余的,被长度16h约束没存到inc.com中不影响使用,已修改.
1 2 3 4  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023