Autor Thema: OS-Dev mit Intelassembler  (Gelesen 19222 mal)

Buschpilot

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« am: 17. December 2011, 21:47 »
Hallo!

ich bin am verzweifeln. ich wage mich daran ein kleines eigenes os zu programmieren.
das problem ist dass ich überhaupt nicht weiss wie ich den code compilen soll.
ich würde gerne mit der intel-syntax arbeiten. habe GCC versucht aber der gibt mir ständig fehler aus zum beispiel bei kommentaren und anderen sachen weshalb ich echt nicht weiss wie das gehen soll.
echt schade wenn es an solchen sachen scheitern würde!

im vorraus danke für die hilfe :)

mfg buschpilot

Relbmessa

  • Beiträge: 73
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 17. December 2011, 22:25 »
Hallo Buschpilot
ohne genaue Frage, keine Antwort möglich!
Ein paar Fakten sind schon nötig.
Auf welcher Plattform programmierst Du? Linux -Windows

Gruß
Relbmessa

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 17. December 2011, 23:46 »
Hallo,

gcc ist kein Assembler, sondern ein (C-)Compiler. C hat nur eine Syntax, also geht es dir vermutlich um die Assemblersyntax. Dazu gibt es im Wiki ein paar Anleitungen, wie man da auf Intelsyntax umstellen kann. (Bei ganzen Dateien mit Parameter "-masm=intel", bei Inline-Assembler mit zwei Direktiven, deren Namen ich aus dem Kopf nicht weiß.) In jedem Fall solltest du die AT&T-Syntax wenigstens lesen können.

Kommentare sind auch in Assemblerdateien im C-Style, also: /* Kommentar */.

Im Übrigen schließe ich mich Relbmessa an: Mehr Informationen, bitte.

Gruß,
Svenska

Buschpilot

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 18. December 2011, 00:09 »
Tut mir Leid meinte natürlich den GAS.
Ich habe Windows und Linux also beides.
Ich bräuchte eben einfach einen Assembler der die Intel-syntax kompiliert. Hab die Option -masm=intel schon ausprobiert allerdings zeigt gas dann für mich unerklärliche fehler auf. habe auch gelesen, dass die intel syntax trotzdem minimal anders ist bei gas. wüsste jemand inwiefern?


Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 18. December 2011, 00:14 »
Gib uns Beispielcode und Fehler, dann können wir vielleicht auch was dazu sagen. "Geht nicht" ist viel zu oft eine unzureichende Fehlerbeschreibung...
Alternativ kannst du auch NASM benutzen, der macht Intelsyntax.

Relbmessa

  • Beiträge: 73
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 18. December 2011, 00:38 »
Zitat
Alternativ kannst du auch NASM benutzen, der macht Intelsyntax.

NASM kann ich auch empfehlen,dazu KWrite als Editor.

Gruß
Relbmessa
« Letzte Änderung: 18. December 2011, 00:41 von Relbmessa »

Buschpilot

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 18. December 2011, 09:02 »
;*********bootloader***********

extern kernel

org 0
jmp 0x07c0h:start

start:

mov ax, 7c0h
mov ds, ax
mov es, ax

call kernel

DB 510-$ dup(0)
DW 0AA55h

Fehlermeldung:

bootloader.S: Assembler messages:
bootloader.S:3: Error: no such instruction: 'extern kernel'
bootloader.S:5: Error: no such instruction: 'org 0'
bootloader.S:6: Error: junk 'h:start' after expression
bootloader.S:10: Error: too many memory references for 'mov'
bootloader.S:11: Error: too many memory references for 'mov'
bootloader.S:12: Error: too many memory references for 'mov'
bootloader.S:16: Error: no such instruction: 'db 510-$ dup(0)'
bootloader.S:17: Error: no such instruction: 'dw 0AA55h'

Ich will nicht sagen das der Coder richtig ist, bin momentan nämlich ziemlich verwirrt mit all den syntax rund um assembler aber dennoch kommen mir einige fehlermeldung gar skurril vor.

den NASM hab ich auch auf dem PC. Aber wie bei den anderen auch weiss ich die syntax nicht. unterscheidet sich ja minimal nur weiss ich nicht wie.

schonmal danke für die tolle hilfe!
« Letzte Änderung: 18. December 2011, 09:04 von Buschpilot »

Relbmessa

  • Beiträge: 73
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 18. December 2011, 11:09 »
Hallo Buschpilot
Ein paar mehr Grundlagen sind schon nötig!
ohne Fleiß usw.
Es gibt viele schöne Beispiele die man erst mal studieren sollte.

naja:
Und ein Laufwerk wird ja auch noch benötigt.
Hier ein kleines Beispiel mit NASM.
;NASM -> nasm -f bin -o boot.bin boot.asm

org 0x7C00 ; set up start address of bootloader
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; setup a stack and segment regs ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    xor ax, ax ;null
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, ax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; read kernel from floppy disk ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    mov [bootdrive], dl ; boot drive stored by BIOS in DL.
                        ; we save it to [bootdrive] to play for safety.
load_kernel:
    xor ax, ax         ; mov ax, 0  => function "reset"
    int 0x13         
    jc load_kernel     ; trouble? try again

    mov bx, 0x8000     ; set up start address of kernel
    ; set parameters for reading function
    ; 8-bit-wise for better overview
    mov dl,[bootdrive] ; select boot drive
    mov al,1          ; read 1 sectors  >anzahl<
    mov ch, 0          ; cylinder = 0
    mov cl, 2          ; sector   = 2 (erster Sector Bootsector)
    mov dh, 0          ; head     = 0
    mov ah, 2          ; function "read"
    int 0x13         

;;;;;;;;;;;;;;;;;;
; jump to kernel ;
;;;;;;;;;;;;;;;;;;
    jmp 0x0000:0x8000   ; address of kernel. "jmp bx" might also work.

;;;;;;;;
; data ;
;;;;;;;;
   bootdrive db 0    ; boot drive
   
    times 510-($-$$) hlt
    dw 0xAA55
 

Viel Spaß beim Üben
Gruß
Relbmessa

Buschpilot

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 18. December 2011, 11:17 »
Danke! Werde ich machen :)

Nur noch die frage mit der syntax wie genau unterscheidet sich die bei nasm vom masm?
Finde dazu im internet nichts. Ist mein letztes problem soweit

Relbmessa

  • Beiträge: 73
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 18. December 2011, 11:39 »
Hallo Buschpilot
Ich verstehe deine Frage nicht!
-Ich glaube nicht, dass sich Einer hinsetzt und die Unterschiede rausarbeitet.
-Für Dich wird es keine relevanten Unterschiede geben.
-Was sich unterscheidet sind die vielen kleinen Zusatzhilfen .(Pseudobefehle)
-Die Lizens unterscheidet sie auch!!!! :-o
Gruß
Relbmessa

Buschpilot

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 18. December 2011, 11:46 »
Dann ist ja gut wenn es keine wichtigen unterschiede für mich gibt.
Die Frage hat sich dann geklärt :)

Vielen Dank an alle!

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 18. December 2011, 13:39 »
Hallo,

um noch kurz ein paar Dinge zu nennen, die mir gerade einfallen:

Pseudobefehle wie extern kriegen beim GAS einen Punkt vorangestellt. Hexadezimalzahlen werden als 0xZAHL dargestellt, MASM/NASM sollten auch ZAHLh verstehen. Beides zusammen ist aber definitiv falsch.

Zum Code: Der Bootsektor sollte eigentlich keine externen Funktionen einbinden, da er den Code dafür ja erst vom Speichermedium laden und an die richtige Stelle im RAM setzen muss. Außerdem solltest du dir nochmal wirklich überlegen, ob du dir den ganzen Boot-Ärger überhaupt antun möchtest. Alles, was vor dem Kernel liegt (also der Bootcode) ist viel Aufwand und Technik von vor ewigen Zeiten mit allen Quirks und seltsamer Hardware. Die allgemeine Empfehlung hier ist, das komplett wegzulassen und einen der vorhandenen gut funktionierenden Bootloader zu benutzen (z.B. Grub, Syslinux). Wenn du ein Betriebssystem (und keinen Bootloader) schreiben möchtest, ersparst du dir eine Menge nutzlosen Aufwand.

Denke bitte drüber nach.

Gruß,
Svenska

Buschpilot

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 18. December 2011, 20:57 »
Hatte ich auch schon überlegt allerdings habe ich keine ahnung wie ich den Multiboot-header da genau einbaue um zum beispiel mit grub zu booten.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 19. December 2011, 00:57 »
Also die Dokumentation deines Assembler solltest du kennen, wenn du mit Assembler arbeiten möchtest.
Davon abgesehen: Wenn du die Multibootsignatur im Binary nicht an die richtige Stelle bekommst, wirst du höchstwahrscheinlich auch keinen funktionierenden Bootloader hinkriegen.

Im Wiki gibt es ein Tutorial, was du mal durchspielen kannst, das ist aber mit C und nur wenig Assembler.

DerHartmut

  • Beiträge: 236
    • Profil anzeigen
    • Mein Blog
Gespeichert
$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;
Nutze die Macht, nutze Perl ;-)

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #15 am: 19. December 2011, 11:24 »
@DerHarmut
Sicher das es keine Nebenwirkungen gibt? OsDev macht süchtig :evil:
SCNR

Dieser Post ist eigentlich komplett überflüssig, macht sich aber gut in der Statistik  :wink:

Grüße,
LittleFox

Buschpilot

  • Beiträge: 12
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 20. December 2011, 19:55 »
MB_MAGIC dd equ 0x1badb002
MB_FLAGS dd equ 0x0
MB_CHECKSUM dd -(MB_MAGIC + MB_FLAGS)

würde das so funktionieren? (NASM)

LittleFox

  • Beiträge: 306
    • Profil anzeigen
    • LF-Net.org
Gespeichert
« Antwort #17 am: 20. December 2011, 20:53 »
Hi,

bei mir sieht es so aus:
section multiboot
align 4

FLAGS    equ 0x6
MAGIC    equ 0x1BADB002
CHECKSUM equ -(MAGIC + FLAGS) ; Checksum

MultiBootHeader: 
  dd MAGIC       ; Magic number
  dd FLAGS       ; Flags
  dd CHECKSUM    ; Checksum

die Sektion ist wichtig, wenn dein Kernel mal Größer als 8KB wird (und das wird er ziemlich schnell ;)). Durch die eigene Sektionen kannst du im Linkerscript festlegen, dass der Multiboot-Header an erster Stelle in der Datei ist.
Align 4 ist wichtig, müsste aber Standard sein
Die Flags kannst du erstmal ignorieren, ich arbeite mit VESA :)
Der Rest ist wie bei dir, nur anders geschrieben :)

Grüße,
LittleFox

freecrac

  • Beiträge: 86
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 23. December 2011, 09:25 »
Dann ist ja gut wenn es keine wichtigen unterschiede für mich gibt.
Die Frage hat sich dann geklärt :)

Vielen Dank an alle!
Es gibt ein paar Unterschiede beim Syntax der Befehle:

MASM:
mov BYTE PTR[EAX], 1
NASM:
mov BYTE[EAX], 1

MASM:
mov esi, OFFSET SPEICHER
NASM:
mov esi, SPEICHER

MASM:
mov eax, DWORD PTR[di+0Ch]
NASM:
mov eax, [di+0Ch]

Dirk

Sannaj

  • Beiträge: 103
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 23. December 2011, 15:30 »
Es gibt ein paar Unterschiede beim Syntax der Befehle:

MASM:
mov BYTE PTR[EAX], 1
NASM:
mov BYTE[EAX], 1
NASM akzeptiert aber auch die Schreibung mit "PTR"
Zitat
MASM:
mov esi, OFFSET SPEICHER
NASM:
mov esi, SPEICHER
Nasm kennt nur eine Sorte von Symbolen, das Label. Dahinter wird immer die Referenz auf ein Objekt verstanden. Für den Speicherzugriff müssen also immer eckige Klammern verwendet werden.

 

Einloggen