logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Assembler - TSR z obsługą przerwania int 21h do tworzenia pliku

SebaS 13 Wrz 2003 21:13 2426 3
REKLAMA
  • #1 325757
    SebaS
    Poziom 12  
    Posty: 11
    Pytanie moze nie do konca dotyczy tego forum ale wiekszosc programujacych uP w assemblerze ma podstawy assemblera z komputerow PC... mam nadzieje ze zagladaja tu jacys specjalisci z tej dziedziny.
    Do rzeczy! Pisze TSRa czyli program rezydentny i mam problem z obsloga przerwania int 21h. Chodzi o to, ze moj TSR musi utworzyc plik i zapisywac do niego "jakies" dane. Czy ktos z Was robil juz cos takiego? Chodzi mi o jak najprostrzy sposób. Nie musi to byc niezawodne - byle by tylko czasem dzialalo...:)
    Za wszelka pomoc serdecznie z gory dziekuje!
    Pozdrawiam: -Sebastian
  • REKLAMA
  • #2 325810
    ElGregor
    Poziom 23  
    Posty: 654
    Pomógł: 2
    Ocena: 56
    Utworzenie pliku:
    filename  db "test.txt", 0  ;zero-term. string
    handle    dw 0
    ;-------------------
        mov dx, offset filename
        mov cx, 0          ;ATTR_NORMAL
        mov ah, 3Ch        ;Create File
        int 21h
        jc error_handler
        mov handle, ax
    Zapis do pliku:
    msg db "Hello"
    len equ $ - msg        ;msg length
        mov dx, offset msg
        mov cx, len
        mov bx, handle     ;handle
        mov ah, 40h        ;Write File
        int 21h
    Zamknięcie pliku:
        mov bx, handle     ;handle
        mov ah, 3Eh        ;Close File
        int 21h


    I jeszcze atrybuty przy tworzeniu pliku (rejestr CX)
       = 0000h : ATTR_NORMAL
       = 0001h : ATTR_READONLY
       = 0002h : ATTR_HIDDEN
       = 0004h : ATTR_SYSTEM
       = 0008h : ATTR_VOLUME
       = 0020h : ATTR_ARCHIVE
    Oraz błędy jakie może zwrócić funkcja:
    CF = 0 : no error
      AX = handle
    CF = 1 : error
      AX = 3 : ERROR_PATH_NOT_FOUND
         = 4 : ERROR_TOO_MANY_OPEN_FILES
         = 5 : ERROR_ACCESS_DENIED
    
  • REKLAMA
  • #3 326983
    SebaS
    Poziom 12  
    Posty: 11
    Tak, tak... dzieki za bardzo szczegolowa odpowiedz...:) ale tak juz niestety probowalem i program sie zawiesza! Niestety w programach rezydentnych nie mozna tak sobie wywolywac przerwana int 21h bo DOS nie jest systemem wielozadaniowym... W czasie jak chodzi TSR moze byc uruchomiony inny program, ktory np. cos zapisuje na dysku... Wiem ze mozna to jakos obejsc ale przyklady ktore mam sa bardzo zawile i stosowane w "profesjonalnych " - komercyjnych aplikacjach DOSowych. Szukam jakiegos prostego sposobu by z rezydenta wywolac przerwania dosowe a przynajmniej dostep do HDD.
    Prosze o dalsze odpowiedzi :)
    Pozdrawiam: -Seba
  • #4 327018
    ElGregor
    Poziom 23  
    Posty: 654
    Pomógł: 2
    Ocena: 56
    Zgadza się, DOS nie jest systemem wielozadaniowym, ale panowie z Microsoftu ułatwili trochę zadanie, służy do tego flaga systemowa InDos. Sygnalizuje ona czy jest aktualnie wykonywana jakaś funkcja dosu i czy program rezydentrny jej nie przerwał. Wartość 0 oznacza że możemy wywołać przerwanie INT21, wartość różna od zera że nie możemy. Pytanie tylko gdzie ją znaleźć? Oto odpowiedź:
    wywołaj funkcję 34h przerwania INT21, po powrocie rejestry ES:BX zawierają segment i offset flagi InDos.
REKLAMA