|
wangff
初级用户
积分 134
发帖 54
注册 2008-11-19
状态 离线
|
|
2008-12-9 11:37 |
|
|
wangff
初级用户
积分 134
发帖 54
注册 2008-11-19
状态 离线
|
『第
2 楼』:
@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 ]
|
|
2008-12-9 16:09 |
|
|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『第
3 楼』:
wangff兄可不可以讲解下int 16的1号功能是怎么用的?
此帖被 +2 点积分 点击查看详情 评分人:【 xxi 】 | 分数: +2 | 时间:2009-6-25 02:33 |
|
|
|
2008-12-9 19:33 |
|
|
wangff
初级用户
积分 134
发帖 54
注册 2008-11-19
状态 离线
|
『第
4 楼』:
键盘服务(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
此帖被 +7 点积分 点击查看详情 评分人:【 HAT 】 | 分数: +4 | 时间:2008-12-9 21:04 | 评分人:【 s11ss 】 | 分数: +3 | 时间:2008-12-9 21:05 |
|
|
|
2008-12-9 20:58 |
|
|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『第
5 楼』:
不好意思,这不算讲解吧?至少给一两个例子说明下嘛:)
|
|
2008-12-9 21:04 |
|
|
wangff
初级用户
积分 134
发帖 54
注册 2008-11-19
状态 离线
|
『第
6 楼』:
(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 不知说清楚否?打字很慢,请谅解.
此帖被 +3 点积分 点击查看详情 评分人:【 s11ss 】 | 分数: +3 | 时间:2008-12-9 22:04 |
|
|
|
2008-12-9 21:28 |
|
|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『第
7 楼』:
mov ah,0
int 16
上面两句不就是读输入么,还要1号功能干什么?
|
|
2008-12-9 22:03 |
|
|
wangff
初级用户
积分 134
发帖 54
注册 2008-11-19
状态 离线
|
『第
8 楼』:
Quote: | 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 ]
|
|
2008-12-9 22:15 |
|
|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『第
9 楼』:
Quote: | 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 [SI],BL DS:0000=CD
-
我还是觉得用0号就行了
[ Last edited by s11ss on 2008-12-9 at 22:22 ]
|
|
2008-12-9 22:20 |
|
|
wangff
初级用户
积分 134
发帖 54
注册 2008-11-19
状态 离线
|
『第
10 楼』:
2楼的例子:
inc i ::有参数(任意)等待输入一个字符,通过errorlevel返回
就只用了ah=0
而:
inc ::无参数检测是否有按键 无:errorlevel=0 有errorlevel=键值 可用干运行中动态检测按键
则必须用到 ah=1
|
|
2008-12-9 22:36 |
|
|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『第
11 楼』:
Quote: | 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啊
|
|
2008-12-9 22:48 |
|
|
wangff
初级用户
积分 134
发帖 54
注册 2008-11-19
状态 离线
|
『第
12 楼』:
@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 ]
|
|
2008-12-9 23:02 |
|
|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『第
13 楼』:
我慢慢体会吧,有劳了,wangff兄
|
|
2008-12-9 23:30 |
|
|
s11ss
银牌会员
积分 2098
发帖 566
注册 2007-9-11
状态 离线
|
『第
14 楼』:
二楼的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,何故?
|
|
2008-12-9 23:59 |
|
|
wangff
初级用户
积分 134
发帖 54
注册 2008-11-19
状态 离线
|
『第
15 楼』:
Quote: | 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中不影响使用,已修改.
|
|
2008-12-10 08:22 |
|