Autor Thema: Kann den Code aus Magazin 1 nicht assemblieren  (Gelesen 15971 mal)

Rev4n

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« 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

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 22. August 2006, 23:31 »
Das Magazin war eigtl. immer korrekt. Beschreib mal wie du das ganze genau assemblieren willst, und mit welchen Anwendungen genau.
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

Rev4n

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 23. August 2006, 05:39 »
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 ben”tigt)
error : Illegal argument type or count
000017       int 0x10 ; schreiben
000018 940c 000d jmp putstr ; N„chstes 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 gewnschte Funktion (reset)
error : Illegal argument type or count
00001e       mov dl, [bootdrv] ; Dieses Laufwerk ist gewnscht
error : Illegal argument type or count
00001f       int 13h ; den Interrupt ausfhren
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 ; Datenl„nge = 512 Bytes
000032       dw 0AA55h

Assembly complete with 42 errors

Biehler Productions2

  • Beiträge: 47
    • Profil anzeigen
    • http://biehlos.biehler-josef.de
Gespeichert
« Antwort #3 am: 23. August 2006, 11:02 »
Zitat von: Rev4n
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/

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 23. August 2006, 12:03 »
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:
Zitat
Nimm nen anderen Assembler.

 :wink: Ich personlich neme NASM  :wink:
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Rev4n

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 23. August 2006, 14:05 »
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.

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 23. August 2006, 14:18 »
klingt so als ob du vergessen hattest das an sich unwichtige label "load" aufzunehmen...  sonst hätt ich keine erklärung
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

Rev4n

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 23. August 2006, 14:25 »
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 ben”tigt)
int 0x10 ; schreiben
jmp putstr ; N„chstes Byte
putstrd:
retn

; Lade den Kernel vom Bootlaufwerk
load:

; Diskdrive reset (Interrupt 13h, 0)
push ds ; Sichere DS
mov ax, 0 ; Die gewnschte Funktion (reset)
mov dl, [bootdrv] ; Dieses Laufwerk ist gewnscht
int 13h ; den Interrupt ausfhren
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 ; Datenl„nge = 512 Bytes
dw 0AA55h

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 23. August 2006, 14:56 »
Sehr komisch, ich she keinen Fehler...
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 23. August 2006, 15:08 »
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
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Rev4n

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 23. August 2006, 15:52 »
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?

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 23. August 2006, 16:07 »
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, ...
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 23. August 2006, 16:10 »
Jo aber nicht alle BIOSes nehmen USB-Geräte als Bootlaufwerke.
Meins gehört nicht dazu  :wink:


Noooooooooooos

Rev4n

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 23. August 2006, 16:17 »
Ich benutze die Virtual Server 2005 Beta 2 klappt es darauf, ein eigenes OS zu testen oder eher nicht?

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 23. August 2006, 16:57 »
müsste an sich gehn, zu dem genau kann ich allerdings nichts sagen *g*
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 23. August 2006, 17:08 »
Zitat
Oder kennt jemand vll noch eine gute IDE mit eingebautem Compiler?

Also ich benutzte NASMEdit
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Rev4n

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 23. August 2006, 18:43 »
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?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 23. August 2006, 18:59 »
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

Biehler Productions2

  • Beiträge: 47
    • Profil anzeigen
    • http://biehlos.biehler-josef.de
Gespeichert
« Antwort #18 am: 23. August 2006, 19:25 »
@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.

Rev4n

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 23. August 2006, 21:08 »
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? ;)

 

Einloggen