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)