2017-01-07 2 views
5

Конфигурация:Использование 3Dh причины прерывания только возвращения "Acces Denied"

MS-DOS 16 BIT (запись в файл .asm, затем их компиляции с TASM и TLINK)

ОС Windows 7 x64

Я создал простую программу в сборке, которая должна только ОТКРЫТЬ файл и написать ему текст.
Вот код для него:

assume cs:code, ds:data 
data segment 
    fileName db "input.txt", 0 ; We assure it is an ASCIIZ(ero) file. 
    toWrite db "Hello World!", "$" 
data ends 

code segment 
    writeToFile: 
    ; pentru functia 3Dh 
    mov AH, 3Dh 
    mov AL, 0h 
    mov dx, offset fileName 
    int 21h 
    ret 


    start_program: 
    mov ax, data 
    mov ds, ax 
    CALL writeToFile 
    mov ax, 4c00h 
    int 21h 
code ends 

end start_program 

Я использовал TurboDebugger, чтобы посмотреть, что происходит. Как ни странно, он всегда ставит в AX значении 0005 смысла Access Denied

Все, что я мог бы найти в интернете для поиска ASSEMBLY access denied open file было около DLL «s и это не помогло.

Я пробовал все, от перезапуска моей программы до открытия dosbox «Как администратора». К сожалению, ничего не получилось, и у меня нет идей.
Странно, что мой друг сказал, что после активации его окон 10 все работает нормально.

В чем причина получения только «доступа отказано»? Я упоминаю, что мне удалось создать, удалить и закрыть файлы, но я не могу их открыть.

+3

'AX'' '' 'не означает, что доступ запрещен сам по себе, только если' CF' установлен для указания ошибки. В противном случае это всего лишь ваш дескриптор файла. Итак, вы проверили значение 'CF'? – Jester

+0

Нет, потому что до сих пор я работал с функциями, которые не требовали 'CF' и забывали об этом. Да, ты прав! «CF» - 0. Спасибо. Я удалю этот пост. – SnuKies

+0

Это был хорошо заданный вопрос, хотя (не многие мы видим), слишком плохо, что у него есть тривиальный ответ :) – Jester

ответ

2

Для правильной работы вашей WriteToFile процедуры должна

  • открыть файл с режимом доступа, что позволяет последующее написание
  • Проверьте CF возвращаемого DOS, чтобы увидеть, если все прошло хорошо

Что я заметил, так это то, что вы завершаете текст, который вы будете писать в этом файле с помощью «$». Интересно, знаете ли вы, что функция DOS для записи файла работает только с указанной длиной в CX, а не с каким-либо разделителем. У вас могут быть другие веские причины для этого символа «$»;

writeToFile: 
    mov ax, 3D01h ; 01h=WriteAccess 
    mov dx, offset fileName 
    int 21h 
    jc NOK 
    mov bx, ax  ; Handle 
    mov dx, offset toWrite 
    mov cx, 12  ; Length of "Hello World!" 
    mov ah, 40h 
    int 21h 
    jc NOK 
    cmp ax, cx 
    jne NOK 
NOK: 
    ret 

Где вы поместите ярлык NOK и что вы делаете там полностью зависит от того, сколько усилий вы хотите провел в борьбе с ошибками, возвращенных DOS. Здесь, в этой очень простой программе, вы можете просто вернуться из call и завершить программу.

Смежные вопросы