MS-DOS中,用户程序课访问从地址00000h开始到0FFFFFh结束的1MB内存
从00000h到09ffffh结束的前640k内存称为常规内存区
从0A000h到0fffffh结束的384k是rom硬件驱动程序,视频刷新缓冲区
而前640k可分为操作系统区域和临时程序区域
-
重新分配内存
-
空余内存指针
-
4AH ;重新分配内存 ;AH=4Ah ;ES=已分配的内存块段地址 ;BX=要求分配的内存节数(1节=16字节) ;cf=0成功 ;cf=1错误 ;bx=该内存块最大内存节数 ;ax=错误码
-
-
分配内存
-
48h可实现内存的动态分配
-
48H ;分配内存 ;AH=48H ;bx=分配的内存节数 ;cf=0成功 ;ax=分配到的内存块段地址 ;cf=1失败 ;bx=最大可用内存节数 ;ax=错误码
-
-
释放内存
-
49h
-
49h ;释放内存 ;AH=49h ;es=要释放的内存块段地址 ;cf=0成功 ;cf=1失败 ;ax=错误码
-
文件操作
汇编要求存放在内存中的文件名后面要加上一个值为0的字节,用来表示文件名的截止
DOS预定义了文件代号0-4与标准输入输出设备对应
0—标准输入设备
1—标准输出设备
2—标准错误输出设备
3—标准辅助设备
4—标准打印设备
-
文件的创建与打开
-
3Ch用来创建一个新文件,普通文件的属性就设为0
-
3CH ;创建文件 ;ds:ds=文件名字符串的地址 ;cx=文件属性 ;cf=0成功 ;ax=文件代号 ;cf=1 ;ax=错误码
-
3Dh用来打开一个文件
-
3Dh ;打开文件 ;DS:Dx=文件名字符串的地址 ;al=打开方式,0只读,1只写,2读写 ;cf=0成功 ;ax=文件代号 ;cf=1失败 ;ax=错误码
-
3Fh用来读取文件,40h用来写入文件
-
3Fh ;读文件 ;ds:dx=数据缓冲区地址,文件的内容被读取到这里 ;bx=文件代号 ;cx=需要读取的字节数,必须效于缓冲区的长度 ;ax=实际读取的字节数 40h ;写文件 ;ds:dx=数据缓冲区地址,这里的内容被写入到文件里 ;bx=文件代号 ;cx=要写入的字节数 ;ax=实际写入的字节数
-
3Eh用来关闭文件
-
3Eh ;关闭文件 ;bx=文件代号 ;cf=0成功 ;cf=1失败
-
ex:
data segment
file1 db '1.txt',0;读取的源文件
handle1 dw 0
file2 db '2.txt',0;创建的目标文件
handle2 dw 0
buf db 0;一次读取一个字节的缓冲区
data ends
code segment
assume cs:code,ds:data
main:
mov ax,data
mov ds,ax
mov ah,3Dh;打开文件功能号
mov dx,offset file1;源文件名
mov al,0;只读
int 21h
jc exit;cf=1说明错误
mov [handle1],ax
mov ah,3ch
mov cx,0
mov dx,offset file2
int 21h
jc exit
mov [handle2],ax
again:
mov ah,3fh
mov bx,[handle1]
mov cx,1
mov dx,offset buf
int 21h
jc done
cmp ax,0
jz done
mov ah,40
mov bx,[handle2]
mov cx,1
mov dx,offset buf;这里dx会改变吗
int 21h
;这里需要判断ax吗
jmp again
done:
mov ah,3Eh
mov bx,[handle1]
int 21h
mov ah,3Eh
mov bx,[handle2]
int 21h
exit:
mov ah,4ch
int 21h
code ends
end main