中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-14 09:09
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 通过大家努力,批处理可告别choice
楼 主 通过大家努力,批处理可告别choice 发表于 2008-12-09 11:37 ·  中国 福建 泉州 移动
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
改进版在26楼:
大家共同改进!

@echo off
call inc 2>nul
if %errorlevel%==1 (
>inc.src echo ecs:100 B8 00 01 CD 16 B8 00 00 74 02 CD 16 B4 4C CD 21
>>inc.src echo rcx
>>inc.src echo 10
>>inc.src echo w
>>inc.src echo q
debug inc.com < inc.src 2>nul 1>nul
del inc.src
)
:loop
inc
if not %errorlevel%==0 (
echo %errorlevel%
if %errorlevel%==81 goto :eof ::q or Q exit
if %errorlevel%==113 goto :eof
)
ping -n 2 127.1>nul
goto loop


[ Last edited by wangff on 2008-12-11 at 10:34 ]
本帖最近评分记录 (共 4 条) 点击查看详情
评分人分数时间
Helloworld +1 2008-12-09 13:34
s11ss +11 2008-12-09 19:31
wxcute +4 2008-12-10 13:46
523066680 +15 2008-12-13 10:56
2 发表于 2008-12-09 16:09 ·  中国 福建 泉州 移动
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
@echo off
call inc 2>nul
if %errorlevel%==1 ( ::inc 不存在则创建
>inc.src echo ecs:100 A0 5D 00 3C 20 75 09 B4 01 CD 16 B8 00 00 74 02 CD 16 B4 4C CD 21
>>inc.src echo rcx
>>inc.src echo 16
>>inc.src echo w
>>inc.src echo q
debug inc.com < inc.src 2>nul 1>nul
del inc.src
)
set/p =input:<nul
inc i ::有参数(任意)等待输入一个字符,通过errorlevel返回
echo %errorlevel%
:loop
inc ::无参数检测是否有按键 无:errorlevel=0 有errorlevel=键值 可用干运行中动态检测按键
echo %errorlevel%
if not %errorlevel%==0 (
if %errorlevel%==81 goto :eof ::q or Q exit
if %errorlevel%==113 goto :eof
)
ping -n 2 127.1>nul
goto loop


[ Last edited by wangff on 2008-12-10 at 21:35 ]
3 发表于 2008-12-09 19:33 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
UID 97070
性别 男
状态 离线
wangff兄可不可以讲解下int 16的1号功能是怎么用的?
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
xxi +2 2009-06-25 02:33
4 发表于 2008-12-09 20:58 ·  中国 福建 泉州 电信
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
键盘服务(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
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
HAT +4 2008-12-09 21:04
s11ss +3 2008-12-09 21:05
5 发表于 2008-12-09 21:04 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
UID 97070
性别 男
状态 离线
不好意思,这不算讲解吧?至少给一两个例子说明下嘛:)
6 发表于 2008-12-09 21:28 ·  中国 福建 泉州 电信
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
(2)、功能01H
功能描述:读取键盘状态
入口参数:AH=01H——检查普通键盘
出口参数:ZF=1——无字符输入,否则,AH=键盘的扫描码,AL=ASCII码。

mov     ah,1     ;检测是否按键
int 16h
mov ax,0 ;ah=0 读键,清al
jz ret ;zf=1 无按键返回0
int 16h ;有按键,读出的ASCII在al

ret:
mov ah,4ch ;将al返回给 errorleve
int 21h


不知说清楚否?打字很慢,请谅解.
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
s11ss +3 2008-12-09 22:04
7 发表于 2008-12-09 22:03 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
UID 97070
性别 男
状态 离线
mov ah,0
int 16

上面两句不就是读输入么,还要1号功能干什么?
8 发表于 2008-12-09 22:15 ·  中国 福建 泉州 电信
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
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 发表于 2008-12-09 22:20 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
UID 97070
性别 男
状态 离线
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 发表于 2008-12-09 22:36 ·  中国 福建 泉州 电信
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
2楼的例子:
inc i ::有参数(任意)等待输入一个字符,通过errorlevel返回

就只用了ah=0

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

则必须用到 ah=1
11 发表于 2008-12-09 22:48 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
UID 97070
性别 男
状态 离线
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 发表于 2008-12-09 23:02 ·  中国 福建 泉州 电信
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
@echo off

:loop
for /f "tokens=*" %%a in ('ping -n 1 127.1 ^| findstr /i "Request Reply"') do echo.%%a
inc ::无参数检测是否有按键 无:errorlevel=0 有errorlevel=键值 可用干运行中动态检测按键
if not %errorlevel%==0 (
if %errorlevel%==112 pause ::input p or P pause
if %errorlevel%==90 pause
if %errorlevel%==81 goto :eof ::input q or Q exit
if %errorlevel%==113 goto :eof
)
ping -n 2 127.1>nul
goto loop



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

[ Last edited by wangff on 2008-12-9 at 23:06 ]
13 发表于 2008-12-09 23:30 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
UID 97070
性别 男
状态 离线
我慢慢体会吧,有劳了,wangff兄
14 发表于 2008-12-09 23:59 ·  中国 北京 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
UID 97070
性别 男
状态 离线
二楼的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 发表于 2008-12-10 08:22 ·  中国 福建 泉州 移动
初级用户
★★
积分 134
发帖 54
注册 2008-11-19 11:47
UID 131429
性别 男
状态 离线
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中不影响使用,已修改.
论坛跳转: