dos绪论

0.msdos三模块:io.sys,msdos.sys,command.com
1.内部命令(30个左右):
常用:
dir
copy
type    显示文本文件
rename
del
date
time
cls
cd
md
用于批处理:
call    调用批文件
echo    命令显示开关
for        循环
goto    转向
if        条件
pause    暂停执行
shift    移动替换参数
内部命令的执行实际上是调用同名子程序。这些子程序位于command.com中。
接收内部命令后,command.com进程查表找到相应子程序的入口。
2.外部命令(50个左右):
format        磁盘格式化
diskcopy    软盘之间的复制
diskcomp    软盘之间的比较
comp        文件之间的比较
chkdsk        检查磁盘
backup        备份磁盘文件
restore        恢复磁盘文件
debug        调试程序
edlin        行编辑程序
edit        文本编辑程序
fdisk        硬盘分区
exe2bin        exe文件转换
外部命令实际上是一个存在于磁盘上的可执行文件。通常把与操作系统有关的磁盘可执行文件作为dos的外部命令。
3.command.com中有一个专门的批处理子程序负责解释执行.bat
4.dos中断服务程序都属于软中断,大部分位于msdos.sys模块中。
5.中断服务程序分两类:
n=21h,系统功能调用
n!=21h,中断调用
6.bios的rom中也有硬件和软件中断程序,即bios中断
7.bat文件:
(1)copy con命令:由键盘直接输入bat文件的各行语句。
如:copy con filedir.bat
ctrl+z结束编辑
(2)rem    注释,会以大写字母显示其后的字母
(3)autoexec.bat文件:dos启动最后阶段,会在引导盘的根目录下寻找并执行autoexec.bat。
(4)prompt    设置系统提示符为当前驱动器符加当前目录名再加上>符号。
(5)path    指出.com文件,.exe文件,.bat文件的查找路径
(6)set    设置一个环境变量
8.dos系统设置:config.sys
(1)功能和autoexec.bat类似,建立方法完全相同
(2)启动过程中由io.sys处理
(3)break=on    表示允许ctrl-c和ctrl-break检查
files=20    表示dos能打开的文件最多有多少,dos系统固定占用5个,20-5=15
buffers=20    设置磁盘缓冲区的数目。磁盘缓冲区用来存放访问磁盘过程中某些数据的副本,节省读盘时间。
(4)用于系统配置的命令分3组
<1>系统参数指派命令
1>break命令
外部设备一般分为字符设备(键盘、屏幕、打印机)和块设备(磁盘),字符设备工作时dos总要检查ctrl-c或ctrl-break是否被按下。而块设备工作时,若break=on,才检查。
2>files命令
打开文件两种方式:1.句柄方式。2.文件控制块方式
该命令指定程序以文件句柄方式总共可以同时打开多少个文件。
files=n
n范围    8——255    缺省8
dos内部,files每加1,系统文件表就增1个表项
3>fcbs命令
指定以文件控制块方式打开文件时的最大数
fcbs=n
n范围    1——255    缺省4
fcb源于CP/M系统,基本弃用。。
4>buffers命令
n范围:1——99    缺省:2——15(由RAM和磁盘类型不同造成)
5>country命令
设定各个国家不同的日期、时间和货币代号的表现格式
默认美国方式
6>lastdrive命令
设置dos承认的最后一个驱动器符
lastdrive=字母
7>drivparm命令:
dos允许带多种类型的块设备。
dos启动时为每个块设备分配一个驱动器符,并设置一个磁盘参数表DPB
若新驱动器规格dos无法识别,需用drivparm命令指明参数,以便建立相应DPB
drivparm=/D:drive [/F:form] [/H:heads] [/S:sectors] [/T:tracks]
drive代表驱动器号,A=0,B=1……。form是驱动器的形状系数(可参见dos手册),heads是磁头数,sectors是每磁道的扇区数,tracks是磁道数。
8>stacks命令:
设置堆栈池中栈区的个数和每个栈区的大小。
堆栈池:dos内部的一个区域,专为接管硬件中断而设置。
硬件中断在中断向量表中的地址指向内存低地址的dos内核。这样dos获得控制权,将ss寄存器指向堆栈池,然后串接到中断处理程序,隔离了应用程序和rom-bios
stacks=n,s
n指定栈个数,8——64,s指定栈的字节数,32——512
286以上机器:n=9,s=128
9>switches命令:
为了使用增强型键盘,书上写的不太理解。。主要是不形象,,~
<2>设备驱动程序安装命令
pc上每一种外设都有一个确定的设备驱动程序。
驱动程序分两类:
一类是标准设备驱动程序:在io.sys中,专门用于控制台(键盘和显示器)、打印机、串行口、实时钟、磁盘等
另一类是可安装设备驱动程序:其它驱动
1>device命令
device=[d:][path]filename[parameters]
filename:要装入的驱动程序名
parameters:传递给驱动程序的一组参数
2>devicehigh命令
作用类似于device,只是它把驱动程序装入上位内存
常规内存:0——640KB
上位内存(umb):640KB——1024KB
高位内存(hma):1024KB——1088KB
延伸内存:1024KB——16MB
<3>其他程序安装命令
专门用于安装那些不具备设备驱动程序标准格式的,并且需要常驻的程序。
1>shell命令
安装命令处理程序(即各种shell)
shell=[d:][path]filename[parameters]
如果安装的是command.com,且其不在系统盘下,则需在这里指出路径。
2>install命令
主要用于安装下面四种外部命令程序:
fastopen.exe    快速打开文件
keyb.com        扩展键盘
nlsfunc.exe        指定国别信息
share.exe        文件共享
<3>dos命令:
把dos的一部分搬到高位内存,从而增加用户使用的空间。
两个参数:第一个为high或low,表示是否将dos的一部分搬到1M地址以上的第1个64KB内存区
第二个参数可为umb或没有参数
(这个命令让我有点紊乱。。。)

端口操作笔记与实验14,求优化。。

1.注意8086的内存与内存地址空间的区别:
内存:主存
内存地址空间:各种存储器和cpu的地址、数据及控制线相连,cpu操控时把它们当做内存对待,总的看成一个逻辑存储器。
2.端口实际上是各个芯片中的寄存器,cpu对它们统一编址。
3.cpu可以直接读写地方:
(1)cpu内部寄存器
(2)内存单元
(3)端口
4.cpu最多定位64KB个端口,端口地址范围:0——65535
5.端口读写必须用in、out指令
6.在in和out指令中,只能用ax或al来存放从端口读入的数据或要发送到端口中的数据
7.8位端口用al,16位端口用ax
8.对0——255以内端口读写:端口号用立即数
对256——65535的端口读写:端口号放dx中
9.cmos ram芯片
简称cmos
(1)包含一个实时钟,和128个存储单元的ram存储器
(2)电池供电,
(3)128个字节中,0——0dh:实时钟的时间信息。其余:系统配置信息
(4)两个端口:70h是地址端口,存放要访问的coms ram单元的地址。71h是数据端口,存放要读取或写入的数据。
(5)coms ram中的时间信息:
秒:0 分:2 时:4 日:7 月:8 年:9
这些数据以BCD码存放
每个信息用1个字节(两个BCD码,即两位十进制数),高四位表示十位,低四位表示个位。
10.通过上述知识点的总结,本人突然理清了以前一直比较模糊的问题。
关于cmos和bios:
(1)cmos里是ram,bios里是rom
(2)cmos只存数据,bios存程序
(3)开机进入bios,看到的是bios rom中的软件程序(此时已装入内存)。里面的参数就是cmos ram中的数据,通过bios中的程序设置cmos中的信息。

11.shl和shr:

逻辑左移和逻辑右移

shl ax,1     相当于x2

shr ax,1    相当于/2

当移动位数大于1时,位数应装入cl寄存器,左移时低位补0,右移时高位补0

cf会保存最后移出的那一位。

12.下面写出实验14的代码:

题目:以“年/月/日 时:分:秒”的格式,显示当前的日期、时间

我用了比较笨的办法,将时间格式化到一个字符串,再调用9号dos功能显示,所以代码较长。。。

assume cs:code,ds:data
data segment
db    12 dup (0)
db    17 dup (0),’$’
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov dl,0
mov cx,3

s1:    push cx            ;读取秒、分、时
mov al,dl
out 70h,al
in al,71h
mov cl,4
mov ah,0
shl ax,cl
shr al,cl
add ah,’0′
add al,’0′
mov [bx],al
mov [bx+1],ah
add bx,2
add dl,2
pop cx
loop s1

mov cx,3
mov dl,7

s2:    push cx                ;读取日、月、年
mov al,dl
out 70h,al
in al,71h
mov cl,4
mov ah,0
shl ax,cl
shr al,cl
add ah,’0′
add al,’0′
mov [bx],al
mov [bx+1],ah
add bx,2
inc dl
pop cx
loop s2

mov si,11    ;开始拷贝到第二个db定义数据
mov di,12

mov al,[si]
mov [di],al
dec si
inc di
mov al,[si]
mov [di],al
inc di
mov byte ptr [di],’/’
dec si
inc di
mov al,[si]
mov [di],al
dec si
inc di
mov al,[si]
mov [di],al
inc di
mov byte ptr [di],’/’
dec si
inc di
mov al,[si]
mov [di],al
dec si
inc di
mov al,[si]
mov [di],al
inc di
mov byte ptr [di],’ ‘
dec si
inc di
mov al,[si]
mov [di],al
dec si
inc di
mov al,[si]
mov [di],al
inc di
mov byte ptr [di],’:’
dec si
inc di
mov al,[si]
mov [di],al
dec si
inc di
mov al,[si]
mov [di],al
inc di
mov byte ptr [di],’:’
dec si
inc di
mov al,[si]
mov [di],al
dec si
inc di
mov al,[si]
mov [di],al

mov ah,2        ;置光标
mov bh,0
mov dh,5
mov dl,12
int 10h

mov dx,12        ;输出字符串
mov ah,9
int 21h

mov ax,4c00h
int 21h
code ends
end start