Fehler in Bootloader in masm



  • so hab bootloader von nasm fuer masm angepasst, hab an einigen stelle problem, bitte euch um hilfe.

    ; Datei: test.asm
    .386
    .model TINY
    
    .code
    start:
    	org 7C00h
    					; Erst brauchen wir einen Stack.
        cli				; Keine Interrupts!
    	mov ax, 9000h  	; Stackadresse
    	mov ss, ax      ; SS = 0x9000 (unser Stack)
        mov sp, 0       ; SP = 0x0000  (der Stackpointer)
        sti             ; Interrupts zulassen
    
    	; Segmentregister initialisieren (f黵 Zugriff auf bootdrv notwendig)
        mov ax, 0
        mov es, ax
        mov ds, ax
    
    	; Bootlaufwerk aus DL speichern
        mov [bootdrv], dl
    
        ;Lade unseren Kernel
        call load
    
    	;Springe zu diesem Kernel
        mov ax, 1000h ; Die Adresse des Programms
        mov es, ax     ; Segmentregister updaten
        mov ds, ax
        jmp ds:0
    
    	bootdrv db 0 ;Das Bootlaufwerk
        loadmsg db "Laden...",13,10,0
    
    	; Einen String ausgeben:
        putstr:
        lodsb             ; Byte laden
        or al,al
        jz short putstrd  ; 0-Byte? -> Ende!
    
        mov ah,0Eh        ; Funktion 0x0E
        mov bx,0007h      ; Attribut-Byte (wird nicht ben鰐igt)
        int 10h           ; schreiben
        jmp putstr        ; N鋍hstes Byte
        putstrd:
        retn
    
    	; Lade den Kernel vom Bootlaufwerk
        load:
        ; Diskdrive reset (Interrupt 13h, 0)
        mov ax, 0          ; Die gew黱schte Funktion (reset)
        mov dl, [bootdrv]  ; Dieses Laufwerk ist gew黱scht
        int 13h            ; Den Interrupt ausf黨ren
        jc load            ; Geht nicht? -> Noch mal!
    
        load1:
        mov ax,1000h       ; ES:BX = 0x10000
        mov es,ax
        mov bx, 0
    
        ; Sektoren lesen (Interrupt 13h, 2)
        mov ah, 2         ; Funktion 2 (Lesen)
        mov al, 5         ; Lese 5 Sektoren
        mov cx, 2         ; Cylinder=0, Sector=2
        mov dh, 0         ; Head=0
        mov dl, [bootdrv] ; Laufwerk aus Vorgabe
        int 13h           ; ES:BX =  Daten vom Laufwerk
        jc load1          ; Fehler? Noch mal!
        mov si, offset loadmsg
        call putstr       ; Meldung ausgeben
        retn
    
        times db (510-$) dup(0)   ; Dateil鋘ge: 512 Bytes
        dw 0AA55h                 ; Bootsignatur
    
    ; **********************************
    ; ***********End Boot Loader********
    ; **********************************
    END start
    
    Assembling: main.asm
    main.asm(73) : error A2094: operand must be relocatable
    main.asm(30) : error A2023: instruction operand must have size
    main.asm(69) : error A2022: instruction operands must be the same size
    

    Zeile 30 > jmp ds:0
    Zeile 69 > mov si, offset loadmsg
    Zeile 73 > times db (510-$) dup(0)



  • Keine Ahnung ob das klappt was Du vor hast:

    Zeile 30 > jmp ds:0

    Ich würde es mit

    db 0EAh
    dw 0, 1000h
    

    versuchen. Andere Möglichkeit ist es mit zwei gezielten pushs und einem retf zu arbeiten.

    Zeile 69 > mov si, offset loadmsg

    probier mal

    mov esi, loadmsg
    

    bzw.

    lea esi, loadmsg
    

    Zeile 73 > times db (510-$) dup(0)

    Hier soll das Programm mit 00 auf 510 Byte aufgefüllt werden, gefolgt von der Magicnumber 0xaa55. Ergibt insgesamt 512 Byte. Welche Möglichkeiten gäbe es da in MASM?



  • lupo1977 schrieb:

    Zeile 73 > times db (510-$) dup(0)

    Hier soll das Programm mit 00 auf 510 Byte aufgefüllt werden, gefolgt von der Magicnumber 0xaa55. Ergibt insgesamt 512 Byte. Welche Möglichkeiten gäbe es da in MASM?

    Probiere es mal mit:

    org start + ((($-start)/510)*510)+510
    

    Ob dieser Bereich auch mit Nullen gefüllt kann ich dir aber nicht garantieren.

    Dirk



  • freecrac schrieb:

    Probiere es mal mit:

    org start + ((($-start)/510)*510)+510
    

    Ob dieser Bereich auch mit Nullen gefüllt kann ich dir aber nicht garantieren.

    Dirk

    Ups Gedankenfehler, besser wäre wohl:

    org start + (((($-start)/512)*512)+512)-2
    DB aa55h
    

    Dirk



  • Ohne Worte...:

    DW aa55h
    

    Dirk(auch nur ein Mensch)


Anmelden zum Antworten