Két adattömb betöltése

Két adattömb betöltése
2010-10-14T17:37:25+02:00
2010-10-17T20:44:52+02:00
2022-11-19T13:15:37+01:00
Latkóczy Dávid
Üdv!

Szeretnék beolvasni két adattömböt a harmadik, és negyedik szektorból a mutato, és a pozicio memóriacímekre.
A mutató rendesen betöltődik, és kirajzolódik, de lesz mellette pár fekete pixel is, ha a pozicio-t is betöltöm.
A pozicio betöltése kicsit bekavar, de nem tudom, hogy miért. Elvileg nem kellene egymást felülírniuk.
Vagy rosszul csinálok valamit?

Illetve még az érdekelne, hogyha sikerül betöltenem a negyedik szektort a pozicioba, bele tudom -e pakolni DI-be sima mov-al?
mov DI, pozicio
(pozicio egy egyelemű tömb: db 32171)*

; Mutato betöltese a harmadik szektorbol mov bx,mutato ; Ide fog betöltődni mov cx,3 ; ez: harmadik szektor. call floppyolvasas ; Kurzorpozíció betöltese a negyedik szektorbol mov bx,pozicio ; Ide fog betöltődni mov cx,4 ; ez: negyedik szektor. call floppyolvasas ... floppyolvasas pusha mov ax,1000h ; szegmenscím ax-be mov es,ax ; szegmenscím es-be mov ax,201h ; művelet: olvas xor dx,dx int 13h ; Olvasás popa ret mutato db 0 pozicio db 0

* Ezzel az egészel az lenne a célom, hogy minden kilépéskor elmentsem a DI regiszter értékét a floppy memóriájába (4. szektor), és minden indításkor betöltsem.
Most csak az olvasás a lényeg, a negyedik szektorban már ott van a poz.com, ami tartalmazza az egyelemű adattömböt.
Mutasd a teljes hozzászólást!
Alapvető hiba:
A
floppyiras
szubrutinban az es nincs úgy beállítva, mint az olvasásnál. Tehát bennehagyod az A000-t.
Mutasd a teljes hozzászólást!

  • Az a baj, hogy a
    db 0
    csak 1 bájtot foglal le. Emiatt felülírják egymást.

    Nem tudom, hogy hány bájtos a "mutato" tömböd, legyen az a 10*20 bájt. Ha nasm-et használsz akkor:

    mutato times 10*20 db 0 pozicio dw 0

    a
    dw
    2 bájtot foglal le, mert a DI 2 bájtos. De ez itt most mindegy, mivelhogy ez az utolsó, utána nincs semmi.

    Az a
    mov di,pozicio
    perszehogy működik.
    Mutasd a teljes hozzászólást!
  • A mutato.com (lefordított fájl) 190 bájt, szóval 10*19-nek írtam.
    Így működik!

    A pozíció (poz.com) 1 bájt.
    De gondolom ez függ attól, hogy a DI-ben mekkora szám van.
    Itt nem lenne célszerűbb nem megadni a méretet?

    Ezzel megpróbáltam beírni a DI-t a negyedik szektorba kilépéskor, a VirtualBox jelzi is, hogy floppy írás van, de következő indításkor nem a mentett pozíción lesz a cursor.

    ... utato betöltese a harmadik szektorbol mov bx,mutato ; Ide fog betöltődni mov cx,3 ; ez: harmadik szektor. call floppyolvasas ; Kurzorpozíció betöltese a negyedik szektorbol mov bx,pozicio ; Ide fog betöltődni mov cx,4 ; ez: negyedik szektor. call floppyolvasas mov DI,pozicio ... kilep: ;DI írása 4. szektorba mov bx,pozicio mov cx,4 call floppyiras ... floppyiras pusha mov ax,301h ; művelet: írás xor dx,dx int 13h ; Írás popa ret
    Mutasd a teljes hozzászólást!
  • Szia!

    Bizony a mutato egy 0 értékű valami (bájt)

    Helyette valami ilyesmi
    mutato LABEL WORD db 0 DUP (ide a hossz)

    Esetleg így
    @mutato: mutato db 0 dup (512) ;Használat lea di, [mutato]
    Mutasd a teljes hozzászólást!
  • A mutato mostmár jó.
    Viszont a pozíció elmentése nem akar működni.

    ;Kurzorpozíció betöltese a negyedik szektorbol mov bx,pozicio ; Ide fog betöltődni mov cx,4 ; ez: negyedik szektor. call floppyolvasas mov DI,pozicio kilep: mov bx,DI mov cx,4 call floppyiras ... floppyolvasas pusha mov ax,1000h ; szegmenscím ax-be mov es,ax ; szegmenscím es-be mov ax,201h ; művelet: olvas xor dx,dx int 13h ; Olvasás popa ret floppyiras pusha mov ax,301h ; művelet: írás xor dx,dx int 13h ; Írás popa ret
    Mutasd a teljes hozzászólást!
  • Amikor egy memóriacímről olvasol egy regiszterbe NASM-ben, akkor ez így nem jó:
    mov di,pozicio
    .
    Mert ez a memória címét tölti be és nem az értékét.
    Ha az értékét akarod, akkor:
    mov di,[pozicio]
    és amikor elmenteni akarod:
    mov [pozicio],di mov bx,pozicio
    és nem
    mov bx,di
    , mert a bx-be itt memóriacím kell, nem az érték.
    Mutasd a teljes hozzászólást!
  • Még mindíg nem jó.
    A VirtualBox kijelzi a floppy írást, de következő indításkor nem az új pozíció töltődik be.

    mentes: mov [pozicio],DI mov BX,pozicio mov CX,4 call floppyiras ret betoltes: mov bx,pozicio ; Ide fog betöltődni mov cx,4 ; ez: negyedik szektor. call floppyolvasas mov DI,[pozicio] ret

    Itt a teljes forráskód, hátha ez segít.
    Mutasd a teljes hozzászólást!
  • Alapvető hiba:
    A
    floppyiras
    szubrutinban az es nincs úgy beállítva, mint az olvasásnál. Tehát bennehagyod az A000-t.
    Mutasd a teljes hozzászólást!
  • Ezt "szépen" benéztem...
    Köszönöm!
    Így már jó a dolog.
    Mutasd a teljes hozzászólást!
  • Úgy működik, ha kilépéskor mentek, indításkor betöltök, de gondoltam megcsinálom, hogy közben is lehessen menteni, betölteni, pl space és enter megnyomásával.

    Viszont ilyenkor az egész megáll, olyan mint egy lefagyás, nemnagyon reagál a gombokra, bár néha sikerül Esc-vel kilépni.
    Ha mentés után kilépés van, az úgy nem rossz, de ha olvas (billentyűfigyelés), akkor igen. Ezért gondoltam, hogy a mentes megváltoztat valami regisztert, ami az olvasnak kell, de az csak AX-et használja, ami mindig kinullázódik, meg AH-t, amibe belepakolja a billentyű értékét. Próbáltam mindenhova pusha, popa-t.

    A floppyiras akkor így rendben van?

    floppyiras:
    pusha
    mov ax,1000h ; szegmenscím ax-be
    mov es,ax ; szegmenscím es-be
    mov ax,301h ; művelet: írás
    xor dx,dx
    int 13h ; Írás
    popa
    ret

    Vagy az ES-be valami más kell?
    Kipróbáltam egy ilyet is, hogy a dupla pusha ne legyen gond:

    mentes:
    pusha
    mov [pozicio],DI
    mov BX,pozicio
    mov CX,4
    mov ax,1000h ; szegmenscím ax-be
    mov es,ax ; szegmenscím es-be
    mov ax,301h ; művelet: írás
    xor dx,dx
    int 13h ; Írás
    popa
    ret

    Mert eddig így volt:

    mentes:
    pusha
    call iras
    popa

    iras:
    pusha
    ...
    popa

    Ez így nem okoz gondot?
    Mutasd a teljes hozzászólást!
  • A
    pusha
    ,
    popa
    nem menti el a szegmensregisztereket (cs, ds, es!!!, ss). Ezért nem áll vissza az A000. Tegyél be
    push es
    -t,
    pop es
    -t!

    Vigyázz arra, hogy a pop-nál fordítva kell:
    pusha push es pop es popa
    Mutasd a teljes hozzászólást!
  • Köszönöm!
    Még egy "apróság" amire nem gondoltam.
    Így már szupi!
    Mutasd a teljes hozzászólást!
  • amire nem gondoltam

    ... és arra sem gondoltál, hogy mostmár tényleg el kéne olvasni azt a nyomorult kézikönyvet ...
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd