2015-06-23 4 views
1

Я пытаюсь создать новый файл с использованием языка ассемблера в MASM 6.11 и DOSBox в Windows 7. У меня есть установочный диск C, D, E как папки BIN, BINR и palce, где находятся мои программы. Когда я пытаюсь запустить свою программу на консоли, она застревает, но когда я ее дебютирую, использование команды команды CV прекращается нормально. Вот мой код:Создание и сохранение текстового файла в сборке

.model small 
.stack 100h 

.data 
    NazwaPliku db "dane.txt", 0 
    UchwytPliku dw ? 
    Napis db "ASSEMBLER" 

.code 
     ASSUME cs: @code, ds: @data 
     mov ax, @data 
     mov ds, ax 

main PROC 
     MOV AH,3CH 
     MOV CX,0 
     MOV DX,OFFSET NazwaPliku 
     INT 21H 

     MOV AH, 3DH 
     MOV AL, 0 
     MOV DX, OFFSET NazwaPliku 
     INT 21H 
     mov UchwytPliku, ax 

     MOV AH,40H 
     MOV BX, UchwytPliku 
     MOV DX,OFFSET Napis 
     MOV CX, 5 
     INT 21H 

     mov ah, 4Ch 
     mov al, 0 
    int 21h 
main ENDP 

END main 

Я знаю, что это очень простая программа, но я не могу заставить его работать ...

+2

Вы открываете файл дважды, с AH = 3Ch и AH = 3Dh. – ElderBug

+3

Инициализация 'DS' не будет выполнена. Надавите строку 'main PROC' на две строки вверх. – rkhb

+1

Кроме того, вы не создаете код доступа при открытии файла с помощью 'int 21h/ah = 3Dh'. Если вы хотите открыть файл для записи, вы должны использовать 'al = 1' или' al = 2'. И когда вы создаете файл с помощью 'int 21h/ah = 3Ch', вы должны сначала очистить' cl', если не хотите каких-либо специальных атрибутов в файле. – Michael

ответ

1

Это ваша программа с исправлениями

.model small 
.stack 100h 

.data 
    NazwaPliku db "dane.txt", 0 
    UchwytPliku dw ? 
    Napis db "ASSEMBLER" 

.code 
     ASSUME cs: @code, ds: @data 
main PROC 
     mov ax, @data    <- Put in the execution path! 
     mov ds, ax     <- so below "main PROC" 

     MOV AH,3CH 
     MOV CX,0 
     MOV DX,OFFSET NazwaPliku 
     INT 21H 
     jc fail     <- In case DOS failed the operation 

     ;MOV AH, 3DH    <- After a succesful creation, the 
     ;MOV AL, 1     <- file is already opened for normal 
     ;MOV DX, OFFSET NazwaPliku <- read and write access. 
     ;INT 21H 
     ;jc fail 

     mov UchwytPliku, ax 

     MOV AH,40H 
     MOV BX, UchwytPliku 
     MOV DX,OFFSET Napis 
     MOV CX, 5     <- "ASSEMBLER" has 9 bytes. Typo ? 
     INT 21H 
     ;jc fail 

fail: 
     mov ah, 4Ch 
     mov al, 0 
     int 21h 
main ENDP 

END main 

Было бы лучше отображать сообщение всякий раз, когда операция завершилась неудачно.

Если вам действительно нужно явно открыть файл, сначала закройте его после его создания.

MOV AH,3CH 
    MOV CX,0 
    MOV DX,OFFSET NazwaPliku 
    INT 21H 
    jc fail 

    mov bx, ax 
    mov ah, 3Eh 
    int 21h 
    jc fail 

    MOV AH, 3DH 
    MOV AL, 1 
    MOV DX, OFFSET NazwaPliku 
    INT 21H 
    jc fail 
    mov UchwytPliku, ax 
Смежные вопросы