Szektor beolvasása adattömbbe

Szektor beolvasása adattömbbe
2010-10-13T17:02:24+02:00
2010-10-13T19:57:30+02:00
2022-11-19T12:10:38+01:00
Latkóczy Dávid
Sziasztok!

Hogyan tudnám átalakítani ezt a betöltőkódot, hogy a beolvasott szektor tartalmát ne a megadott memóriacímre (1000h:0) pakolja, hanem a 'mutato' adattömbbe?

... mov ax,1000h mov es,ax xor bx,bx mov ax,201h mov cx,3 ; Harmadik szektor xor dx,dx int 13h ; olvasás ... mutato db 0

A harmadik szektorba egy mutato.egr nevű fájlt írtam:
(.egr => EGéR )

db 0,7,7,7,7,7,7,7,7,7 db 139,0,7,7,7,7,7,7,7,7 db 139,139,0,7,7,7,7,7,7,7 db 139,139,139,0,7,7,7,7,7,7 db 139,92,139,139,0,7,7,7,7,7 db 139,92,139,139,139,0,7,7,7,7 db 139,92,92,139,139,139,0,7,7,7 db 139,92,92,139,139,139,139,0,7,7 db 139,92,92,92,139,139,139,139,0,7 db 139,92,92,92,139,139,139,139,139,0 db 139,92,92,139,0,0,0,0,0,0 db 139,92,139,0,92,139,0,7,7,7 db 139,139,0,7,139,92,139,0,7,7 db 139,0,7,7,139,92,139,0,7,7 db 0,7,7,7,7,139,92,139,0,7 db 7,7,7,7,7,139,92,139,0,7 db 7,7,7,7,7,7,139,92,139,0 db 7,7,7,7,7,7,139,139,139,0 db 7,7,7,7,7,7,7,0,0,0

Én először erre gondoltam:
mov ax,mutato
mov es,ax
xor bx,bx
mov ax,201h
mov cx,3
xor dx,dx
int 13h
Így a memóriacím mutato:0-lesz, de enne valószínűleg semmi értelme, mert nem működik.
Mutasd a teljes hozzászólást!
Összekevered a szegmenscímet az offsetcímmel.
A fordító az egyes címkékhez offsetcímet rendel hozzá.
Te pedig a címet az es-be teszed.

Az szektorolvasásnál az es:bx párost kell használni a címzésre.
Az es-be a szegmenscímet kell tenni (1000h).
és a bx-be tedd a mutatót!
mov ax,1000h mov es,ax mov bx,mutato
Mutasd a teljes hozzászólást!

  • mov ax, addr mutato

    ?
    Mutasd a teljes hozzászólást!
  • Nem tetszik a fordítónak...
    nasmw: error: comma or end of line expected
    Mutasd a teljes hozzászólást!
  • Itt a másoló kódja is, ami fölmásolja a fájlokat a floppyba:

    org 256 ; boot1 az első szektorba mov ax,3d00h mov dx,boot1 int 21h mov bx,ax mov ah,3fh mov cx,512 mov dx,ide int 21h mov ax,301h mov bx,ide mov cx,1 xor dx,dx int 13h ; boot2 a második szektorba mov ax,3d00h mov dx,boot2 int 21h mov bx,ax mov ah,3fh mov cx,512 mov dx,ide int 21h mov ax,301h mov bx,ide mov cx,2 xor dx,dx int 13h ; boot3 a harmadik szektorba mov ax,3d00h mov dx,boot3 int 21h mov bx,ax mov ah,3fh mov cx,512 mov dx,ide int 21h mov ax,301h mov bx,ide mov cx,3 xor dx,dx int 13h ret boot1 db "loader.com",0 ; Ez a bootloader boot2 db "cur.com",0 ; Ez a progi boot3 db "mutato.egr",0 ; Ez pedig a fájl ide db 0

    Most úgy néz ki a dolog, hogy a kurzor helyett egy fekete négyzet jelenik meg, de mozgatni ugyanúgy tudom.
    ...
    mov ax, mutato
    mov es,ax
    xor bx,bx
    mov ax,201h
    mov cx,3 ; Harmadik szektor
    xor dx,dx
    int 13h ; olvasás
    ...
    Mivel a másoló a loadert, és a programot is rárakja a floppyra, gondolom, hogy a mutato.egr-t is.
    Szóval csak az adattömbbe történő beolvasással lehet a gond.
    Mutasd a teljes hozzászólást!
  • Összekevered a szegmenscímet az offsetcímmel.
    A fordító az egyes címkékhez offsetcímet rendel hozzá.
    Te pedig a címet az es-be teszed.

    Az szektorolvasásnál az es:bx párost kell használni a címzésre.
    Az es-be a szegmenscímet kell tenni (1000h).
    és a bx-be tedd a mutatót!
    mov ax,1000h mov es,ax mov bx,mutato
    Mutasd a teljes hozzászólást!
  • Köszönöm!
    Így már működőképes, bár még mindig nem az igazni, mert a mutatóban össze vannak kavarodva a színek.
    Mindjárt megnézem mi okozhatja...
    Mutasd a teljes hozzászólást!
  • Eszembejutott, hogy a start után hiányoznak a beállításokat,a multkor is ez okozta a gondot.

    org 0 start: cli xor ax,ax mov ss,ax mov sp,0 sti mov ds,ax ;----------------------------------------; ; Cursor ; ;----------------------------------------; ; Harmadik szektort a mutato cimkere olvassa: mov ax,1000h mov es,ax mov bx,mutato ; Ide fog betöltődni mov ax,201h mov cx,3 ; Harmadik szektor xor dx,dx int 13h ; olvasás ...

    De még így sem jó.
    A cursor most "rózsaszín pöttyös"
    Mutasd a teljes hozzászólást!
  • Most ezzel nullára állítottad a szegmensregisztereket.
    Ez azért baj, mert pl. a ds most nem az 1000h-ra mutat. Így nem elérhetőek a pixelek.

    Előbb milyen színkavarodás volt?
    Mutasd a teljes hozzászólást!
  • Ezt a kódot eredetileg így használtam:

    (floppy boot szektorában)
    org 7C00h
    cli
    xor ax,ax
    mov ss,ax
    mov sp,7C00h
    sti
    mov ds,ax

    gondoltam ha most org 0 van, az sp-nél át kell írni a 7C00h-t 0-ra:
    cli
    xor ax,ax
    mov ss,ax
    mov sp,7C00h
    sti
    mov ds,ax

    Így most a kurzoron helyén fekete alapon rózsaszín (meg pár másszínű) pontok vannak.
    Mutasd a teljes hozzászólást!
  • Attól, hogy org 0-t használsz, nem azt jelemnti, hogy az sp-t 0-ra kell állítani.

    A boot loaderben amit írtam, a végén be vannak állítva a szegmensregiszetek. mind a négy (cs:ds:ss:es) a 1000h-ra mutat,
    ahova a program másolódik be. Nem kell őket nullázni, mer akkor a bootloaderre mutatnak.
    Esetleg az es-t átállíthatod, máshova.
    Amikor
    rep movsb
    -vel az adattömbből írsz a videomemóriába, akkor a ds:si-ről es:di-be
    HA a ds-t 0-ra állítod, nem elérhetőek az adattömbben a kurzor pixelei.
    Mutasd a teljes hozzászólást!
  • Jah, tényleg:
    ... mov ax,1000h mov ss,ax mov ds,ax mov es,ax jmp 1000h:0
    Mutasd a teljes hozzászólást!
  • Akkor most tulajdonképpen mi okozza a hibát?

    Hol állítsam át ES-t, mire, és miért?
    mov ax,1000h -> itt?
    mov es,ax
    Lehet, hogy ott már van valami, ahová a mutatót szeretném betölteni? Pedig a "mutato db 0" a legutolsó sorban van, utána már nincsen kód.

    kipróbáltam, hogy a mutato beolvasása elé, és után teszek pusha-t és popa-t, de így sem jó.
    Itt egy kép, hogy hogy néz ki.

    Egyébként itt mire jó a szegmenscím, mért nem elég a "mutato"-t megadni?
    Mutasd a teljes hozzászólást!
  • MEGVAN!
    A mutato fájlt nem fordítottam le!
    Mutasd a teljes hozzászólást!
  • Minden címzés két címmel történik.
    Az, hogy nem jelenik meg a nyilad, csak olyan színes pontok, tutira azt jelenti, hogy rossz címről olvasod az adatot.
    Amikor a
    rep movsb
    -t használod:
    1. ds mutasson a programod szegmenscímére (1000h)
    2. si mutasson a mutatóra
    3. es mutassor a videomemóriaszegmencímre (0a000h)
    4. di mutasson a kezdő pixelcímre (320*sor+oszlop)
    5. cx hány bájtot másolsz

    Ezeket jól nézd át! Valószínűleg különböző emberek módszereit összekevered.

    Szerk.: Na látod!
    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