Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Vampire am 29. July 2004, 09:24
-
Guten Morgen,
habe grad mal ne Frage, fang grad an mir das mit der OS dev anzuschauen bzw. lese schon seit Montag. Habe inzwischen auch Bochs zum Laufen bekommen ohne Diskettenlaufwerk, da dieses freundlicherweise defekt ist usw.. aber egal läuft auf jeden Fall (fast) alles.
Ich habe etwas kentnisse in Assembler, aber die Macros sind mir igrendwie neu, bin das halt etwas anders vom MASM gewöhnt, und bei NASM sieht das etwas anders aus.
Auf jeden Fall habe ich jetzt ne Macrofunktion geschrieben, gegen die sagt er auch nix, aber wenn ich dieselbe aufrufe meint er :
error: parser: instruction expected
mein bescheidener zusammenkopierter Code sieht so aus zumindwest die Kernel.asm:
; ---------------------------------------------------
; Unser Kernel
; ---------------------------------------------------
call registerInterrupt;
mov ax, 1000h ; Segmentregister updaten
mov ds, ax
mov es, ax
start:
;HIIER ZEIGT ER AN WÃRE EIN FEHLER !!!
PrintText msg ; Schicke Bootmessage :)
mov si,msg_boot
call putstr ; Noch eine Message :D
call getkey ; Warte auf einen Tastendruck
jmp reboot ; Reboot
; -------------------------------------------------
; Funktionen und Variablen
; -------------------------------------------------
msg db "Welcome to Morios",13,10,0
msg_boot db "Press any key...",10,0
%include "interrupt.asm"
%include "Functions.asm"
;--------------------------------------------------
%MACRO PrintText 1
mov al, 0x01
mov si, %1
int 0x21
%ENDMACRO
___________________________
über Hilfe wäre ich echt dankbar
-
Hi,
du musst das Macro definieren, bevor du es aufrufst. Setz also den Macrocode irgendwo an den Anfang, dann klappts.
-
PrintText msg ; Schicke Bootmessage
mov si,msg_boot
<--- Ãhm, soweit ich weiß wäre es sinnvoller zuerst die Bootmsg. nach si zu moven und danach das Macro aufzurufen da sonst doch nichts am Bildschirmausgegebn wird.
-
Hi,
das mit dem davor definieren hat schonmal geklappt, kann jetzt ohne Probleme meine bin Files erstellen usw...
aber habe jetzt ein neues Problem, und zwar kann ich mein image erstellen und kann dieses auch ausführen, aber es wird nix mehr von meiner Kernel Datei ausgegeben, denk dass es vielleicht daran liegt, dass er viell. in das Makro reinspringt und sich dann anschließend beendet
also hier ncohmal mein Code:
; ---------------------------------------------------
; Unser Kernel
; ---------------------------------------------------
;%include "int_makro.asm"
;--------------------------------------------------
;die beiden Zeilen werden noch ausgeführt ( nur testweise eingefügt)
mov si,msg
call putstr
;nach dem Macro macht er glaub ich nix mehr
%MACRO PrintText 1
mov al, 0x01
mov si, %1
int 0x21
%ENDMACRO
call registerInterrupt;
mov ax, 1000h ; Segmentregister updaten
mov ds, ax
mov es, ax
start:
mov si,msg
call putstr ; Noch eine Message :D
PrintText msg ; Schicke Bootmessage :)
PrintText msg_boot
mov si,msg_boot
call putstr ; Noch eine Message :D
call getkey ; Warte auf einen Tastendruck
jmp reboot ; Reboot
; -------------------------------------------------
; Funktionen und Variablen
; -------------------------------------------------
msg db "Welcome to Morios",13,10,0
msg_boot db "Press any key...",10,0
%include "Functions.asm"
%include "interrupt.asm"
Vielen Dank
Vampire
-
So hab meinen Fehler gefunden
habe bei dem Lable IregisterInterrput nen iret benutzt anstatt nen ret,jetzt scheint alles zu laufen
dennoch danke für die schnelle Hilfe
Grüße
Vamp
lregisterInterrupt:
push dx
push es
xor ax, ax
mov es, ax
cli
mov word [es:0x21*4], _int0x21 ; Pointer auf den Handler
mov [es:0x21*4+2], cs ; Pointer auf CS
sti
pop es
pop dx
ret
_int0x21:
_int0x21_ser0x01: ; funktion 0x01
cmp al, 0x01 ; funktion 0x01 angefragt?
jne _int0x21_end ; nächste Routine checken
_int0x21_ser0x01_start:
lodsb ; nächstes Byte laden
or al, al ; 0-Byte?
jz _int0x21_ser0x01_end
mov ah, 0x0E ; BIOS Teletype
mov bh, 0x00 ; Page 0
mov bl, 0x07 ; Text-Attribute
int 0x10 ; BIOS-Call
jmp _int0x21_ser0x01_start
_int0x21_ser0x01_end:
jmp _int0x21_end
_int0x21_end:
iret
-
hi
noch ein Fehler:
der erste übergegbene Parameter beim Makro heißt %0 und nicht %1, der zweite %1...
mfg gurru
-
das ist sehr seltsam, weil es nämlich mit %1 funktioniert. Habe grad mal %0 eingesetzt kommt das gleiche ergebnis. Hm.. wurd mir auch net als Fehler ausgelegt.
Aber dank
Grüße
Vamp
-
@Gurru
Da denkst du leider falsch Nasm fängt nicht mir %0 an bei denen ist 1 der Anfang
-
hi
%0 scheint die Anzahl der Parameter zu sein, die das Makro hat(wo zu das gut sein soll, wei0 ich nicht), deshalb lässt es sich auch kompilieren
mfg gurru
PS: jetzt weiß ich auch, warum mein erster Kernel nichts ausgegeben hat
-
hm... solangsam verwirrt mich das echt *gg* also bei mir ist das so dass bei beiden Fällen das richtige ausgegeben wird und nix mit Anzahl oder oder so.
aber habe grad mal selbst gegoogelt, und scheint so zu sein als ob das mit der Anzahl stimmt :)
Wozu das gut ist kann ich DIr sagen, wenn man zum Beispiel ne "Schleife" durch alle Parameter durchziehen will ist das, denk ich sehr hilfreich !
Ach hier der Link, falls es jemand interessiert:
http://alien.dowling.edu/~rohit/nasmdoc4.html#section-4.3.5
Gruß
Vamp
-
Aber man programmiert das Macro ja selbst, und man weiss wieviel Parameter man hat, das ist ja nicht Variabel!!
-
Ja haste auch wieder recht, vielleicht ist es auch einfach nur da, damit man die Anzahl nicht als Zahl angeben muss. Aber ich weiß auch gar net ob das überhaupt geht, weil bei meinem Code war es im Egal ob da %0 oder %1 stand, mir wurd das gleiche ausgegeben, aber egal :)
Gibt viele Funtkionen die die Welt (und Programmierer ) nicht braucht
Grüße
Vamp
-
Programmierer brauchen alles, aber die Welt keine Programmierer^^
-
*hmm* so gehts auch, aber bitte sag sowas net weiter, sonst bekomme ich nach meinem Studium keinen Job als Programmierer *gg*
-
Hi
so habe mich mal intensiver mit Makros beschäftigt unter nasm :)
und zwar wegen dem Parameter %0. Viele fanden ihn unnötig, aber ich denk es gibt schon Situationen wo man ihn braucht, habe grad mal ein kleines Beispiel kreirt:
%MACRO pushm 1-*
%rep %0
push %1
%rotate 1
%endrep
%ENDMACRO
Dies ist eine schleife vom ersten bis zum letzten Element. und zwar wird von vorne (links nach rechts) begonnen. Mit der Definition 1-* sagen wir dass es mindestens 1 Element sein muss, aber unendlich viel mehr sein können
Zum zurückholen der Werte kann man dies dann so regeln:
%MACRO popm 1-*
%rep %0
pop %1
%rotate -1
%endrep
%ENDMACRO
Somit schreiben wir die Werte dann von in die Parameter von Rechts nach links wegen dem %rotate -1
Grüße
Morti
-
Achso ja klar, aber wenn man nicht weiss (so wie ich) das man auch unendliche viele Parameter einbauen kann, dann ergibt das keinen Sinn^^ So ist das natürlich Praktisch