Почему программа не имеет доступ к файлам? - Assembler
Формулировка задачи:
файл kyrsova.asm
то что есть в файле katalog.txt сейчас
Computer
Intel
5
5000
Computer
AMD
7
4500
65656
565
55
6
Notebook
HP
7
5300
Monitor
Philips
3
1300
Monitor
Samsung
5
1700
Mouse
Genius
13
100
Mouse
A4Tech
20
250
Keyboard
Genius
15
140
FlashDrive
Kingston 16GB
9
400
.model small
.stack 100h
.data
.code
start:
mov ax,@data
mov ds,ax
get_action: ; Вибір команди меню
mov di,0
mov bool_empty,0
mov del_done,0
mov action,0
call print_menu ; Вивід меню
mov ah,00
int 16h
cmp ah,1 ; ESC - завершує роботу програми
je quit
cmp al,31h ; 1 - Перегляд вмісту файлу
je action1
cmp al,32h ; 2 - Додавання даних до файлу
je action2
cmp al,33h ; 3 - Редагування даних в файлі
je action3
cmp al,34h ; 4 - Видалення даних з файлу
je action4
jmp get_action
QUIT:
mov ah,4ch
int 21h
ACTION1:
call view_data
mov ah,3Eh
mov bx, handle
int 21h
mov action,1
jmp get_action
ACTION2:
call add_data
mov ah,3Eh
mov bx, handle
int 21h
mov action,2
jmp get_action
ACTION3:
call edit_data
mov ah,3Eh
mov bx, handle1
int 21h
mov ah,3Eh
mov bx, handle2
int 21h
MOV AH,41H ; видаляєм файл "katalog.txt"
LEA DX,filename
INT 21H
LEA DX,filename1
MOV AX,@data
MOV ES,AX ; і перейменовуємо "katalog1.txt" в "katalog.txt"
Lea DI,filename
MOV AH,56H
INT 21H
jmp get_action
ACTION4:
mov action,4
jmp action3
include main.txt
end start
содержание файла main.txt ( на сайт добавлю как вставку asm что б было более читабельно
.model small
.stack 100h
.data
; Структура комп. магазину
nazv_prod db 30 dup(?) ; Назва товару
firma_prod db 30 dup (?) ; Фірма виробника
kilk_st db 10 dup(?) ; Кількість товару
tsina_za_sh db 10 dup(?) ; Ціна за штуку
; Повідомлення для утворення меню
line1 db 201,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,187,'$'
line2 db 200,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,205,188,'$'
case db 186,' Bu',161,'epi',226,236,255,164,'i',238,': ',186,'$'
cs1 db 186,' 1 - ',143,'epe',163,171,239,173,'y',226,'u ',226,'o',162,'apu',255,172,'a',163,'a',167,'u',173,'y. ',186,'$'
cs2 db 186,' 2 - ',132,174,164,'a',226,'u',255,226,'o',162,'ap',255,164,174,255,'c',175,'ucky. ',186,'$'
cs3 db 186,' 3 - Pe',164,'a',163,'y',162,'a',226,'u',255,162,'i',164,'o',172,'oc',226,'i',255,175,'po',255,226,'o',162,'ap. ',186,'$'
cs4 db 186,' 4 - Bu',164,'a',171,'u',226,'u',255,226,'o',162,'ap',255,167,'i',255,'c',175,'ucky. ',186,'$'
csquit db 186,' ESC - Buxi',164,'. ',186,'$'
cscont db 132,171,239,255,175,'po',164,'o',162,166,'e',173,173,239,255,173,'a',226,'uc',173,'i',226,236,255,161,'y',164,236,'-',239,'ky',255,'k',171,'a',162,'i',232,'y.','$'
; Повідомлення і змінні для роботи з файлом
FileName db "Katalog.txt",0
FileName1 db "Katalog1.txt",0
handle dw ?
handle1 dw ?
handle2 dw ?
error1 db 'File not found',10,13,'$'
error2 db 'Illegal consisting of file',10,13,'$'
error3 db 'File is empty',10,13,'$'
error4 db 'Cannot create file',10,13,'$'
tmp db ?
buffer db 30 dup(?)
lline dw (?)
; Повідомлення для виведення даних про товар
msg1 db 141,160,167,162,160,255,226,174,162,160,224,227,': ','$'
msg2 db 148,105,224,172,160,255,162,168,224,174,161,173,168,170,160,': ','$'
msg3 db 138,105,171,236,170,105,225,226,236,255,226,174,162,160,224,227,': ','$'
msg4 db 150,105,173,160,255,226,174,162,160,224,227,': ','$'
msg5 db '______________________________________________________________________','$'
; Повідомлення для додавання даних в файл
str1 db 130,162,165,164,105,226,236,255,173,160,167,162,227,255,226,174,162,160,224,227,': ','$'
str2 db 130,162,165,164,105,226,236,255,228,105,224,172,227,255,162,168,224,174,161,173,168,170,160,': ','$'
str3 db 130,162,165,164,105,226,236,255,170,105,171,236,170,105,225,226,236,255,226,174,162,160,224,227,': ','$'
str4 db 130,162,165,164,105,226,236,255,230,105,173,227,255,226,174,162,160,224,227,': ','$'
num_of_key db 4 dup (?)
bool_empty db ?
action db ?
; Повідомлення для видалення та редагування даних в файлі
ind db 130,162,165,164,105,226,236,255,105,173,164,165,170,225,': ','$'
uncorind db 141,165,175,224,160,162,168,171,236,173,168,169,255,105,173,164,165,170,225,10,13,'$'
index db ?
index_now db ?
str_add_done db 132,160,173,105,255,161,227,171,168,255,164,174,164,160,173,105,255,164,174,255,228,160,169,171,227,46,10,13,'$'
str_edit_done db 132,160,173,105,255,227,255,228,160,169,171,105,255,161,227,171,168,255,162,105,164,224,165,164,160,163,174,162,160,173,105,46,10,13,'$'
str_del_done db 132,160,173,105,255,161,227,171,168,255,162,168,164,160,171,165,173,105,255,167,255,228,160,169,171,227,46,10,13,'$'
del_done dw ?
.code
print_line proc
mov ah,09h
mov dx,lline ; виводить рядок
int 21h ; який знаходить за адресою lline
mov ah,02h ; і переносить каретку на наступний рядок
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h
ret
print_line endp
print_menu proc ; Виведення меню
lea dx,line1
mov lline,dx
call print_line
lea dx,case
mov lline,dx ; Змінна lline використ. в ролі параметра
call print_line ; процедури print_line
lea dx,cs1
mov lline,dx
call print_line
lea dx,cs2
mov lline,dx
call print_line
lea dx,cs3
mov lline,dx
call print_line
lea dx,cs4
mov lline,dx
call print_line
lea dx,csquit
mov lline,dx
call print_line
lea dx,line2
mov lline,dx
call print_line
mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,13
int 21h
ret
print_menu endpРешение задачи: «Почему программа не имеет доступ к файлам?»
textual
Листинг программы
view_data proc ; відкриваємо файл для читання mov ax,716ch <---------------------------- а функция открытия на чтение 3Dh mov bx,0 ; Тільки читання mov cx,0 ; Звичайний файл mov dx,1 ; Відкрити існуючий файл lea si,Filename int 21h jc failed_open mov handle,ax ; Дескриптор файлу mov bool_empty,1
Объяснение кода листинга программы
- Устанавливается функция открытия файла для чтения:
- Имя переменной:
ax - Значение переменной:
716ch
- Имя переменной:
- Устанавливается режим доступа к файлу (только чтение):
- Имя переменной:
bx - Значение переменной:
0
- Имя переменной:
- Устанавливается тип файла (звичайный файл):
- Имя переменной:
cx - Значение переменной:
0
- Имя переменной:
- Устанавливается флаг открытия существующего файла:
- Имя переменной:
dx - Значение переменной:
1
- Имя переменной:
- Устанавливается адрес имени файла в регистре SI:
- Имя переменной:
si - Значение переменной:
Filename
- Имя переменной:
- Вызывается прерывание 21h (сервис 3Dh) для открытия файла:
- Успешное открытие файла - JC (Jump if Carry) не происходит
- Имя переменной:
handle- Дескриптор файла - Имя переменной:
bool_empty- Флаг пустого файла (устанавливается в 1, что может означать успешное открытие файла с данными)