1.重定向
以下a.asm,用含't'及回车13的txt,仿command.com,依masm命令行的arg符号值N,(如masm/Darg=0a;),重定向5个DOS开启文件(STD_):
N=0:是STDIN句柄,先bin方式读1符,再从txt输't'到char
N=1:是STDOUT句柄,输出char的'1'到txt
N=2:是STDERR句柄,输出char的'2'到txt
N=30,31:
3是STDAUX句柄,N=30,从txt输't'到char;N=31,输出char的'3'到txt
N=41:
4是STDPRN句柄,输出char的'4'到txt
调用功能:
N=0时,44,读/写设备info,敲键符值入100h,其ascii/scan对,入106h,遇扩展码时,首对,入104h,次值,入101h.如1,得(31,31,2),ctl_c,得(3,3,2e),F1,得(0,0,3bh),(3bh,0,3bh)
3d,依读写方式,打开txt,保存句柄到si
45,保存STD_句柄的复制值到di
46,将来访问(cx)句柄,重定向为访问(bx)=(si)句柄
3f/40,用STD_输入/出,字符数1,偏置char
3e,关闭txt
DEBUG做完a.com,对输入,见103h的char,变't',对输出,typetxt,见1~4.
ACT=2
IFDEFarg
IFargGT2
财管.家园.fs119.net
IFargEQ30
ACT=30
ENDIF
IFargEQ31
ACT=31
ENDIF
IFargEQ41
ACT=41
ENDIF
STD_=arg/10
ELSE
IFargGE0
ACT=1
STD_=arg
IFargEQ0
ACT=0
ENDIF
ENDIF
ENDIF
ENDIF
IFACTEQ2无效
%OUT/Darg=0|1|2|30|31|41
.ERR
ENDIF
justmacro
localj
movdi,es:[26]敲键,i9写低asc,高scan到[1Ch尾引字],i16读[1Ah首引字]到3f功能的ax
subdi,2
cmpdi,1ch未重划键区,现在回头
jaj
movdi,3ch刚才入尾
j:movax,es:[di]
endm
csegment
assumecs:c,ds:c
org100h
@:jmp@1
chardb'0'STD_
txtdb'txt',0
@1:movah,3dhopen
moval,ACTand1
leadx,txt
int21h
movsi,axhan
movbx,ACTstdin
testbx,63>41
jnz@4
movax,4400hI/O,从/到fil\nul定向,dx=42h\80c4,否则80d3
int21h
xordh,dh
pushdx
movax,4401h
ordl,32bin
int21h
movax,64bios数据区seg,1E~3D是键区
moves,ax
movah,3fh不等回车读
movcx,11符
财软.联盟.fs119.net
leadx,@入256
int21h
cmpbyteptrcs:[256],224测扩展
jz@2
testbyteptrcs:[256],255再测
jnz@3
@2:just
movwordptrtxt,ax
movah,3fh取真
incdx
int21h
@3:just
movwordptrtxt[2],ax
popdx
movax,4401h复原
int21h
@4:movah,45hduplica
movbx,STD_
int21h
movdi,axhan
movah,46hforcehan
movbx,si
movcx,STD_
int21h
movah,3fhACTr/w=3f/40
movbx,STD_
movcx,1
leadx,char
int21h
movah,46h
movbx,di
movcx,STD_
int21h
movah,3ehclose
movbx,si
int21h
ret
cends
end@
2.管道及文件引用计数
反汇编DOS版3.31,得[100,1e9]/[1ea,219]是代码/数据,初值为18/50的1ea/leb,记录屏幕配置行/列数,初值1/1的1ec/1ed,记录已处理行/列数.
流程:
(2.1)100处,用功能30,取主/次版号al/ah,若非3/1f,就显1fc处"MORE:IncorrectDOSversion",再于110,用int20,退出
(2.2)置1ea=19,用int10,ah=0f,得屏幕列数到1eb,如50
财软 联盟 fs119.net
(2.3)用功能45,复制stdin(bx=0)句柄到bp,如5,用功能3e,关闭stdin句柄
(2.4)用功能45,复制stderr(bx=2)句柄(也可复制运行时打开的si),必得已关句柄0,
为看完满屏而读键盘1符时,从stderr或si读,而不移管道stdin指针.
(2.5)139处,用功能3f,打开bp句柄,字节数cx=1000,目的地21a,读stdin
用|接入管道时,more不创建新进程.
未接入时,将读键盘行,如读"135",此串及回车0d,换行0a,被存目的地,被存长度5返到ax,键入符数多于cx时,前面cx个符被存目的地.对^Z单行,ax返回0.
若ax=0,就用14a处的int20退出,否则
(2.6)150处,读目的地每字符到al
读到^Z,则转14a退出
读到0d,置列数1ed=1,转1ac
读到0a,行数1ec加1,转1ac
读到回退08,当1ed=1,转1ac,否则列数减1后,转1ac
读到制表09,则1ed置为下个制表位置,转1ac
读到响铃07,则不占输出列,转1ac
读到其它,1ed加1,比较屏幕配置列数1eb,不大于则转1ac,否则 财,软联盟,fs119.net
1ec加1,再置1ed=1
(2.7)1ac处,
用功能2,显当前符于stdout,以再接管道
若1ec小于屏幕配置行数1ea,则转1e1处,否则用功能09,显出1f0处的"--More--",用功能0c,且al=08,清键盘输入调功能08,无回显,从stderr读键盘1符
输出2空行,再置1ed=1,1ec=1
(2.8)1e1处,
cx减1,结果为0,转139,否则转150
(2.9)用a.com实现:
typea.asm|a.com时,AT机,每秒响铃,或
a.coma.com时,fcb,han各打开a.com,1次dup,1次force_dup,执行子进程,显计数11231123
csegment
assumecs:c;ds:c
org100h
@:jmpinit
cfg_rdb25
cfg_cdb80
cur_rdb1
cur_cdb1
bufdb"a.com"
db1000h-($-buf)dup(0)
buf_=$
keydb'-KEY-$'
crdb13,10,36
old4add59V6
parablkdbparasz
paradb-1
parasz=$-para
db13
envdw0
paraoffdwparablk
parasegdw?
FCB0dw92,?
dd-1
adjmacror,u
locala
moval,r
incal
daa
cmpal,u
stc
jnea
xoral,al
a:movr,al
endm 财管家.园.fs119.net
harpmacro
localh
movah,2
int26
adjdh,96秒BCD
jch
adjcl,96
jch
adjch,36
h:movah,7clr
int26
movah,6set
int26
endm
alarm:pushax
pushcx
pushdx
moval,7
int29h
harp
popdx
popcx
popax
jmpcs:old4a
J2Smacroh
movdi,h
moval,cs:24[di]原JFT
pushsi
pushes
callref
popes
popsi
endm
refproc
cbw
grp:cmpax,es:4[si];cnt
jlSFT
subax,es:4[si]
lessi,es:[si];next_addr
jmpgrp
SFT:mulwordptrold4a
addsi,ax
moval,byteptres:6[si]
addal,48
int41
ret
refendp
openproc
movah,82
int21h
lessi,es:[bxdi]矢SFT
cmpdi,4
jzunix
movah,15
movdx,92
int21h
oral,al
jnzopen1
open0:ret
unix:movax,3d00h
leadx,buf
int21h
jncopen0
open1:int20h
openendp
init:cmpbyteptrcs:[129],-1参数,ALT数字,都无法键入
jeLST_LST
movax,4406h
xorbx,bx
int21h
oral,al 财软联 盟 fs119.net
jzheir
jmpbell已改向
heir:leasp,buf_宽栈
movah,4ah新mem,始es节,长bx节
leabx,bell
addbx,15
rept4
shrbx,1字节转节
endm
int21h
LST_LST:movdi,26
callopen
moval,cs:[116]
callref
movbp,sp为关闭
movdi,4
callopen
pushax
movbx,ax
J2Sbx
movah,45hdup
int21h
pushax
J2Sax
moval,cs:[24]stdin
movbyteptr@,al
movah,46hforce
xorcx,cx
int21h
pushcx
J2Scx
movah,16为exec,关fcb
movdx,92
int21h
cmpbyteptrcs:[129],-1
jeclose
movax,cs
moves,ax
movparaseg,ax
movFCB0[2],ax
leabx,env;es:bx矢参数块
leadx,bufds:dx矢执行名
movax,4b00h
int21h
close:movah,3eh
close0:cmpbp,sp
jzclose1
popbx
int21h释放24[bx]
jmpclose0
close1:moval,byteptr@
movcs:[24],al
int20h
bell:movax,354ah
int21h
movwordptrold4a,bx
movwordptr[old4a2],es
movah,37
leadx,alarm
财软联盟,fs119.net
int21h
harp
xorbx,bx
movah,45h
int21h
movbp,ax
movah,3eh
int21h
movbx,2
movah,45h
int21h
read:leadx,buf
movcx,sizebuf
movbx,bp
movah,3fh
int21h
orax,ax
jnzread1
quit:ldsdx,cs:old4a
movax,254ah
int21h
int20h
read1:movcx,ax
movsi,dx
next:lodsb
cmpal,1ah
jzquit
cmpal,13
jnzCTL_CR
movcur_c,1
jmpshow
CTL_CR:cmpal,10
jnz?back
inccur_r
jmpshow
?back:cmpal,8
jnz?tab
cmpcur_c,1
jzshow
deccur_c
jmpshow
?tab:cmpal,9
jnz?bell
movah,cur_c
addah,7
andah,248
incah
movcur_c,ah
jmpshow
?bell:cmpal,7
jzshow
inccur_c
movah,cur_c
cmpah,cfg_c
jbeshow
inccur_r
movcur_c,1
show:movdl,al
movah,2
int21h
movah,cur_r
cmpah,cfg_r
jbendblk
leadx,key
movah,9
int21h
movax,0c08h
int21h
leadx,cr
movah,9
int21h
movcur_c,1
财软联,盟,fs119.net
movcur_r,1
endblk:deccx
jzread@
jmpnext
read@:jmpread
cends
end@
财管家园.fs119.net
财管家 园 fs119.net
数据统计中!!
Google.cn搜索关键字:
实现 管道 原理 定向 专用 文件 mov int ax ah 21h al
Google.cn搜索相关文章:
谷歌中搜索全球网 5个DOS专用文件的6种io重定向,more实现管道原理
百度中搜索 5个DOS专用文件的6种io重定向,more实现管道原理
谷歌中搜索www.fs119.net 5个DOS专用文件的6种io重定向,more实现管道原理
上一篇:仿FDISK及PQMAGIC列出分区逻辑盘符的prw.asm实现
Google.cn搜索相关文章:
谷歌中搜索全球网 5个DOS专用文件的6种io重定向,more实现管道原理
百度中搜索 5个DOS专用文件的6种io重定向,more实现管道原理
谷歌中搜索www.fs119.net 5个DOS专用文件的6种io重定向,more实现管道原理
下一篇:用MASM32编写通用游戏改器流程
精品课程推荐
相关文章
用MASM32编写通用游戏改器流程 2007-06-15 09:41:44 5个DOS专用文件的6种io重定向,more实现管道原理 2007-06-15 09:41:43 仿FDISK及PQMAGIC列出分区逻辑盘符的prw.asm实现 2007-06-15 09:41:42 驻留exe文件 2007-06-15 09:41:41 动态库的执行时间 2007-06-15 09:41:41 矛与盾的较量——CRC实践篇 2007-06-15 09:41:40