Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Rev4n am 22. August 2006, 23:24
-
Servus,
ich habe eben mal den Code aus Magazin abgetippt, und versucht zu assemblieren. Leider funktioniert das nicht, weil der editor mir mehrere Fehler mit der Bezeichnung "Unknown instruction code" oder "Illegal argument type or count". Habs nun mit mehreren Anwendungen dafür ausprobiert, doch es ist überall so.
Also was ist an dem Magazin falsch, oder was mach ich falsch?
Greets,
Rev4n
-
Das Magazin war eigtl. immer korrekt. Beschreib mal wie du das ganze genau assemblieren willst, und mit welchen Anwendungen genau.
-
Also im moment benutze ich das Programm WAVRASM. Ja und ich gebe darin halt den code ein und klicke oben auf assemble, und dann bekomm ich ein nettes Statusfenster mit sehr vielen Fehlern. Ein anderes Program welches ich ausprobiert habe, (ASMARC) ergab das gleiche Ergebnis
Edit:
Hier der error-log:
AVRASM ver. 1.30 BOOT.ASM Tue Aug 22 23:15:32 2006
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
error : Unknown instruction opcode
000000 org 0x7C00 ; Unsere Startadresse
; ----------------------------------
; Unser Bootloader
; ----------------------------------
start:
; Stack erzeugen
000001 94f8 cli ; Keine Interrupts!
000002 mov ax, 0x90000 ; Stackadresse
error : Illegal argument type or count
000003 mov ss, ax ; SS = 9000 (unser Stack)
error : Illegal argument type or count
000004 mov sp, 0 ; SP = 0000 (der Stackpointer)
error : Illegal argument type or count
000005 sti ; Interrupts zulassen
; Bootlaufwerk aus DL speichern
000006 mov [bootdrv], dl
error : Illegal argument type or count
; Lade unseren kernel
000007 940e 0012 call load
; Springe zu diesem Kernel
000009 mov ax, 0x1000 ; Die Adresse des Programms
error : Illegal argument type or count
00000a mov es, ax ; Segmentregister updaten
error : Illegal argument type or count
00000b mov ds, ax
error : Illegal argument type or count
00000c push ax
error : Illegal argument type or count
00000d mov ax, 0
error : Illegal argument type or count
00000e push ax
error : Illegal argument type or count
00000f retf
; ---------------------------
; Funktionen und Variablen
; ---------------------------
000010 bootdrv db 0 ; Das Bootlaufwerk
000011 loading db "Loading...",13,10,0
; Einen String ausgeben:
putstr:
000012 lodsb ; Byte laden
000013 or al,al
error : Illegal argument type or count
000014 jz short putstrd ; 0-Byte? -> Ende!
000015 mov ah,0x0E ; Funktion 0x0E
error : Illegal argument type or count
000016 mov bx,0x0007 ; Attribut-Byte (wird nicht bentigt)
error : Illegal argument type or count
000017 int 0x10 ; schreiben
000018 940c 000d jmp putstr ; Nchstes Byte
putstrd:
00001a retn
; Lade den Kernel vom Bootlaufwerk
load:
; Diskdrive reset (Interrupt 13h, 0)
00001c push ds ; Sichere DS
error : Illegal argument type or count
00001d mov ax, 0 ; Die gewnschte Funktion (reset)
error : Illegal argument type or count
00001e mov dl, [bootdrv] ; Dieses Laufwerk ist gewnscht
error : Illegal argument type or count
00001f int 13h ; den Interrupt ausfhren
000020 pop ds ; DS wiederherstellen
error : Illegal argument type or count
000021 jc load ; Geht nicht? -> Noch mal!
load:
000022 mov ax,0x1000 ; ES:BX = 10000
error : Illegal argument type or count
000023 mov es,ax
error : Illegal argument type or count
000024 mov bx, 0
error : Illegal argument type or count
; Sektoren lesen (Interrupt 13h, 2)
000025 mov ah, 2 ; Funktion 2 (Lesen)
error : Illegal argument type or count
000026 mov al, 5 ; Lese 5 Sektoren
error : Illegal argument type or count
000027 mov cx, 2 ; Cylinder=0, Sector=2
error : Illegal argument type or count
000028 mov dx, 0 ; Head=0, Laufwerk=0
error : Illegal argument type or count
000029 int 13h ; ES:BX = Daten vom Laufwerk
00002a jc load1 ; Fehler? Noch mal!
00002b mov si,loadmsg
error : Illegal argument type or count
00002c 940e 000d call putstr ; Meldung ausgeben
00002e retn
000030 times 512-($-$$)-2 db 0 ; Datenlnge = 512 Bytes
000032 dw 0AA55h
Assembly complete with 42 errors
-
Also im moment benutze ich das Programm WAVRASM. Ja und ich gebe darin halt den code ein und klicke oben auf assemble, und dann bekomm ich ein nettes Statusfenster mit sehr vielen Fehlern. Ein anderes Program welches ich ausprobiert habe, (ASMARC) ergab das gleiche Ergebnis
Nimm nen anderen Assembler.
Z.b. den FASM (benutze ich und find ihn sehr gut), oder NASM, TASM, etc.
Der WAVRASM ist ein Assembler für Mikroprozessoren, und hat dementsprechend einen ganz anderen Syntax und wird wahrscheinlich viele Befehle der 86er CPU nicht kennen.
Ich denke, der ASMARC wird ebenso für einen nicht 86 kompatiblen CPU hergestellt worden sein und dementsprechend auch viele Befehle nicht kennen, bzw. einen anderen Syntax haben.
Link zum FASM:
http://flatassembler.net/
-
Also ich kann da nur einen Fehler finden
000002 mov ax, 0x90000 ; Stackadresse
hier ist eine Null zu viel
Ansonsten kann ich Biehler Productions2 nur zu stimmen:
Nimm nen anderen Assembler.
:wink: Ich personlich neme NASM :wink:
-
Erstmal danke für die vielen und schnellen Antworten. Es klappt jetzt alles soweit, bis auf ein kleines Prob im Boot quellcode. Und zwar sagt mir der Assembler (FASM), dass "call load" ein invalider operand wäre.
-
klingt so als ob du vergessen hattest das an sich unwichtige label "load" aufzunehmen... sonst hätt ich keine erklärung
-
Also hier ist nochmal mein Sourcecode so wie ich ihn jetzt habe und wie er auch im Magazin abgedruckt ist. Der Kernel lies sich einwandfrei compilieren nur halt der Bootloader nicht. Also entweder ich hab mich vertippt, ich hab noch zu wenig Erfahrung in Assembler programmierung, oder irgendwas anderes läuft nicht recht :wink:
ORG 0x7C00 ; Unsere Startadresse
; ----------------------------------
; Unser Bootloader
; ----------------------------------
start:
; Stack erzeugen
cli ; Keine Interrupts!
mov ax, 0x9000 ; Stackadresse
mov ss, ax ; SS = 9000 (unser Stack)
mov sp, 0 ; SP = 0000 (der Stackpointer)
sti ; Interrupts zulassen
; Bootlaufwerk aus DL speichern
mov [bootdrv], dl
; Lade unseren kernel
call load
; Springe zu diesem Kernel
mov ax, 0x1000 ; Die Adresse des Programms
mov es, ax ; Segmentregister updaten
mov ds, ax
push ax
mov ax, 0
push ax
retf
; ---------------------------
; Funktionen und Variablen
; ---------------------------
bootdrv db 0 ; Das Bootlaufwerk
loading db "Loading...",13,10,0
; Einen String ausgeben:
putstr:
lodsb ; Byte laden
or al,al
jz short putstrd ; 0-Byte? -> Ende!
mov ah,0x0E ; Funktion 0x0E
mov bx,0x0007 ; Attribut-Byte (wird nicht bentigt)
int 0x10 ; schreiben
jmp putstr ; Nchstes Byte
putstrd:
retn
; Lade den Kernel vom Bootlaufwerk
load:
; Diskdrive reset (Interrupt 13h, 0)
push ds ; Sichere DS
mov ax, 0 ; Die gewnschte Funktion (reset)
mov dl, [bootdrv] ; Dieses Laufwerk ist gewnscht
int 13h ; den Interrupt ausfhren
pop ds ; DS wiederherstellen
jc load ; Geht nicht? -> Noch mal!
load1:
mov ax,0x1000 ; ES:BX = 10000
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 dx, 0 ; Head=0, Laufwerk=0
int 13h ; ES:BX = Daten vom Laufwerk
jc load1 ; Fehler? Noch mal!
mov si,loadmsg
call putstr ; Meldung ausgeben
retn
times 512-($-$$)-2 db 0 ; Datenlnge = 512 Bytes
dw 0AA55h
-
Sehr komisch, ich she keinen Fehler...
-
hab den Code ma mit NASM Assembliert. Nasm hat nur gemeckert weil es
loadmsg nicht gibt.
ich denke ma, dass du stat loading ,loadmsg getippt hast(oder umgekert)
wegen dem CALL Load hat er nit gemackert
-
Also mit NASM hat es jetzt geklappt. Hatte zwar gehofft, endlich mal freizeit von Konsolenanwendungen zu haben, weil ich in letzter Zeit mehr als genug damit arbeiten musste aber naja. Oder kennt jemand vll noch eine gute IDE mit eingebautem Compiler?
EDIT: ganz nebenbei, was mache ich als nichtbesitzer eines Diskettenlaufwerks mit dem ganzen. Gibts auch ne Möglichkeit die fertigen Dateien als CD image zu erstellen?
-
Nero (alle ab 5) können nen Diskettenimage für ne Bootcd verwenden, desweiteren gibts MP3-Player die als USB-Floppy gewertet werden wenn sie zur Bootzeit angeschlossen sind (meiner zählt dazu *g*). Ansonsten, Bochs, VMWare, Qemu, ...
-
Jo aber nicht alle BIOSes nehmen USB-Geräte als Bootlaufwerke.
Meins gehört nicht dazu :wink:
Noooooooooooos
-
Ich benutze die Virtual Server 2005 Beta 2 klappt es darauf, ein eigenes OS zu testen oder eher nicht?
-
müsste an sich gehn, zu dem genau kann ich allerdings nichts sagen *g*
-
Oder kennt jemand vll noch eine gute IDE mit eingebautem Compiler?
Also ich benutzte NASMEdit (http://uk.geocities.com/rob_anderton/)
-
Ok, dann zum schluss noch ne ganz dumme Frage, wenn der Pc denn dann das image / die CD bootet, öffnet er die bin dateien oder die raw datei?
-
Nix von beidem, er lädt einfach die ersten paar Sektoren, der CD in den Speicher.
Per Nero... hast du den Inhalt und nicht die Raw-Datei selbst (besteht aus aneinandergereihten bins) auf diese Sektoren der CD gebrannt.
Gruss
Nooooooooooooooos
-
@topic
Wenn ich das Label in "load1" umbenenne und dann schreibe "call load1", bringt er die Meldung nichtmehr.
Wahrscheinlich ist "load" für den FASM irgendein Präprozessor Befehl.
Ansich ist der Code aus dem Magazin aber sowieso NASM Syntax.
-
Ok wär ja schön gewesen wenn alles einfach geklappt hätte. Hab mir Nero 5 installiert, und dann erstma komisch geschaut, bei dem Einstellungsmenü für bootCd's. Ok hab mir ne IMG Datei erstellt mit den beiden bin dateien drin. Ok dann hab ich sie da bei Nero eingegeben. Was mich jetzt stutzig macht, ist, dass wenn ich die CD "brenne" (machs auf den Image recorder) er erstens während des Brennens sagt das der Bootsektor nicht erkannt wurde (oder so ähnlich) und wenn ich danach einfach mal das dadurch entstandene Image mit WinRaR öffne, ist es leer. Ausserdem macht es mich stutzig, dass man erst da nen image auswählen soll und danach nen zusammenstellungseditor kommt wie wenn man ne normale CD zusammenstellt.
Was mach ich falsch oder ist falsch? ;)
-
1. für bootCDs muss man anders programmieren ;)
2. in dem magazin ist es für ein Floppy
3. Floppy (Disketten) kannst du mit RawWrtie beschreiben ... achtung, nicht mit Windows ... also nicht durch Arbeitsplatzt
oder nutze einfach einen Emulator ... Bochs, Qemu, Virtual PC, VMware, ...
alles ist FreeWare, also kostenlos
-
1) Die Bootcd's die ich meinte Waren auch nur Floppy-images... bei sowas einfachem ist das absolut kein Problem.
2) Die RawWrite-Lösung steht im Mag auch drin, es geht darum wenn ebend KEIN Floppy vorhanden ist ;)
Aber wie gesagt, ich würd Bochs, Qemu oder VMWare empfehlen... (Mein Favorit ist VMWare ;) Unter jedem Linux-System ist Qemu aber auch brauchbar - Kernelmodul sei dank ^^)
-
ja, aber man muss schon viel über CDs wissen, um es zu machen ;)
und soweit ich weiß macht das nero nicht ^^
@Noob: Bochs,Qemu, VMware ist auch für linux vorhanden ;)
nur VPC ist für Windows :D
-
Ok letztendlich hab ich alles mit VMWare gebacken bekommen. Das einzige Prob was jetzt noch besteht ist, dass wenn im "StupidOS" steht Press any key, dass da nichts passiert. Ich schätze jetzt einfach mal das es an VMWare liegt. Wenn ich falsch liege korrigiert mich, wenn ich recht habe, bedanke ich mich für die vielen replys und sage, dass dashier wirklich eine sehr gute community ist.
Greets,
Rev4n
-
Ich habe bisher zwei Batchdateien für die Entwicklung vorbereitet.
Ist zwar nicht so flexibel wie Makefiles, dafür aber auch einfach per Doppelklick ausführbar.
Allerdings trickse ich ganz schön rum... ich habe nasm für die Quelltexte (kein C), dd für win32 und die mtools unter Cygwin installiert. Das ganze dann etwas eingebettet (PATH, libs) in mein Windows und es funzt. :-)
Laufwerk x: ist in meiner mtools-Konfiguration als das Image eingebunden.
create.bat
@echo off
echo j|del complete\*.*
cd complete
:: boot loader
echo Compiling Boot loader (stage1)...
nasm -o bootloader.bin -f bin ..\bootloader\main.asm
if errorlevel 1 goto error
:: create floppy image
echo Creating Floppy image (1440 KB)...
dd if=/dev/zero of=floppy.img bs=512 count=2880 > nul
echo.
echo Writing Boot loader (stage1)...
dd if=bootloader.bin of=floppy.img > nul
echo.
echo Copying files...
mcopy loader.bin x:
echo.
echo.
pause
exit
:error
echo.
echo.
echo Fehler aufgetreten!!
echo.
echo.
pause
run.batc:\programme\qemu\qemu.exe -L c:\programme\qemu -fda complete\bootloader.bin -boot a