内存分配与文件操作

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值