Почему программа не имеет доступ к файлам? - Assembler

Узнай цену своей работы

Формулировка задачи:

файл kyrsova.asm
.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
то что есть в файле 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
содержание файла 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

Объяснение кода листинга программы

  1. Устанавливается функция открытия файла для чтения:
    • Имя переменной: ax
    • Значение переменной: 716ch
  2. Устанавливается режим доступа к файлу (только чтение):
    • Имя переменной: bx
    • Значение переменной: 0
  3. Устанавливается тип файла (звичайный файл):
    • Имя переменной: cx
    • Значение переменной: 0
  4. Устанавливается флаг открытия существующего файла:
    • Имя переменной: dx
    • Значение переменной: 1
  5. Устанавливается адрес имени файла в регистре SI:
    • Имя переменной: si
    • Значение переменной: Filename
  6. Вызывается прерывание 21h (сервис 3Dh) для открытия файла:
    • Успешное открытие файла - JC (Jump if Carry) не происходит
    • Имя переменной: handle - Дескриптор файла
    • Имя переменной: bool_empty - Флаг пустого файла (устанавливается в 1, что может означать успешное открытие файла с данными)

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы