下午好。有必要实现一个汇编程序,它执行以下操作:
1. 创建一个名为 XXXXXXXX.LAB 的文件,其中 XXXXXXXX 是您的姓氏。
2. 写入文件行: - 姓、名、组号。
3. 读取文件并在屏幕上显示内容。
4.更改文件属性 - 使其隐藏。
5. 以直接寻址模式写入文件以代替元素 5 数字 8。
6. 从文件中读取编号为 3 - 10 的元素并将它们显示在屏幕上。
步骤 1-4 已完成,但最后 2 点无法完成。下面是程序的代码,在我看来,它应该满足第 1-5 点。
.model small
data segment
cr equ 0dh
lf equ 0ah
string db 'AndrewS-31',cr,lf ;строка для записи
strlnth equ $-string ;ее длина
handle dw ? ;ячейка для дескриптора
fname db 'Solodovnikov.LAB',0 ;имя файла в формате asciiz
buffin db 12 dup ('') ;буфер ввода
replace db '8'
replength equ $-replace
data ends
code segment
assume cs:code, ds:data
main:
mov ax, data
mov ds, ax
;создадние файла
mov ah, 3ch ;функция создания файла
mov cx, 0 ;без аттрибутов
mov dx, offset fname ;адрес имени файла
int 21h
mov handle, ax ;сохраним дескриптор файла
;запись в файл строкиs
mov ah, 40h ;функция записи
mov bx, handle ;дескриптор
mov cx, strlnth ;длина строки
mov dx, offset string ;адрес строки
int 21h
;закрытие файла
mov ah, 3eh ;функция закрытия
mov bx, handle ;дескриптор
int 21h
;открытие файла
mov ah, 3dh
mov al, 2h
mov dx, offset fname
int 21h
mov handle, ax
;чтение из файла строки
mov ah, 3fh
mov bx, handle
mov cx, strlnth
mov dx, offset buffin
int 21h
;вывод строки на консоль
mov ah, 40h
mov bx, 1h
mov cx, 0ch
mov dx, offset buffin
int 21h
;изменение атрибута файла
mov dx, offset fname
mov cl, 2h
mov al, 1h
mov ah, 43h
int 21h
mov ah, 42h ;функция перемещения указателя
mov al, 0 ;выбор смещения: относительно начала файла
mov cx, 0 ;
mov dx, 5h ;смещение на 5 позиций
mov bx, handle
int 21h
mov ah, 40h ;функция записи
mov bx, handle ;дескриптор
mov cx, replength ;длина строки
mov dx, offset replace ;адрес строки
int 21h
mov ah,4ch
int 21h
code ends
end main
但结果是,最后两块代码似乎不见了。需要解决什么问题才能使程序做它想做的事?
解决方案是修复几个问题,其中的关键是在读取缓冲区时替换的值被覆盖(由于其初始长度为零)。除其他外,明确指定了文件打开属性(读写)并添加了程序终止功能。生成的代码如下所示: