Dosbox закрывается при создании текстового файла - PullRequest
0 голосов
/ 21 декабря 2018

Почему после создания файла мой dosbox автоматически отключается ??Любая проблема моего кода?

.model small
.stack 100h
.data
msg1    db      10, 13, 10, 13, "Please select an item:",0Dh,0Ah,0Dh,0Ah,09h
        db      "1- Create File",0Dh,0Ah,09h
        db      "2- show data",0Dh,0Ah,09h      
        db      "3- Exit",0Dh,0Ah,09h
        db      "Enter item number: " 
        db      '$'   
msg2    db      10,13,"Success Create$"
file    db      "test.txt"
handle  dw      ?
buffer  dw      10 dup (?)

.code
main proc 
    mov   ax,@data
    mov   ds,ax

ShowMenu:       
    lea     dx, msg1  
    mov     ah, 09h 
    int     21h     

    mov     ah, 01h ;get choice
    int     21h        

    cmp     al, "1"
    je      CreateFile
    cmp     al, "2"
    je      ShowData
    cmp     al, "3"
    jmp     Quit
    jl      ShowMenu

Quit: 
   mov   ah,4ch
   int   21h   

CreateFile:
mov ah,3ch ;create file
mov cx,0
lea dx,file;set file name
int 21h

lea dx,msg2
int 21h
jmp ShowMenu

ShowData:
mov ah,3dh ;open file
mov al,0   ;open as read only
lea dx,file
int 21h
mov handle,ax

;read one char
mov ah,3fh   ;service to read file
mov bx,handle
mov cx,1        ;how many byte to read
mov dx,buffer   ;where to store
int 21h

;close file
mov ah,3eh
mov bx,handle
int 21h

jmp ShowMenu


main endp
 end main

создать текстовый файл

1 Ответ

0 голосов
/ 22 декабря 2018

Проблема не установки функционального кода 09h перед отображением сообщения об успехе ( комментарий Дэвида Уолферда ) обычно просто закрывает вашу программу, но не эмулятор DOSBox.
Дескриптор, который вы получаете от создания файла, обычно оставлял AH=0 и впоследствии вызывал бы функцию завершения DOS. Завершение программы


file    db      "test.txt"
handle  dw      ?

Еще одна проблема в вашей программе заключается в том, что вы забыли завершить спецификацию файла нулевым символом:

 file    db      "test.txt", 0

Спецификация файла мусора потенциально может привести к отключению DOSBox!

Поскольку переменная handle определена с помощью?(неинициализированная память) вам может не повезло, что следующий байт не равен нулю.

...