Autor Thema: Fehlermeldung beim Macro - Aufruf unter NASM  (Gelesen 6557 mal)

Vampire

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

mastermesh

  • Beiträge: 341
    • Profil anzeigen
    • http://www.kostenloser-laptop.de/
Gespeichert
« Antwort #1 am: 29. July 2004, 09:39 »
Hi,

du musst das Macro definieren, bevor du es aufrufst. Setz also den Macrocode irgendwo an den Anfang, dann klappts.

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 29. July 2004, 09:46 »
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.

Vampire

  • Beiträge: 52
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 29. July 2004, 10:17 »
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

Vampire

  • Beiträge: 52
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 29. July 2004, 10:23 »
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

gurru

  • Beiträge: 42
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 29. July 2004, 23:16 »
hi

noch ein Fehler:
  der erste übergegbene Parameter beim Makro heißt %0 und nicht %1, der zweite %1...

mfg gurru

Vampire

  • Beiträge: 52
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 30. July 2004, 14:13 »
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

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #7 am: 30. July 2004, 14:26 »
@Gurru
Da denkst du leider falsch Nasm fängt nicht mir %0 an bei denen ist 1 der Anfang
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

gurru

  • Beiträge: 42
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 31. July 2004, 23:07 »
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

Vampire

  • Beiträge: 52
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 02. August 2004, 09:05 »
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

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #10 am: 02. August 2004, 09:27 »
Aber man programmiert das Macro ja selbst, und man weiss wieviel Parameter man hat, das ist ja nicht Variabel!!
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Vampire

  • Beiträge: 52
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 02. August 2004, 09:50 »
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

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #12 am: 02. August 2004, 10:08 »
Programmierer brauchen alles, aber die Welt keine Programmierer^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Vampire

  • Beiträge: 52
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 02. August 2004, 10:24 »
*hmm* so gehts auch, aber bitte sag sowas net weiter, sonst bekomme ich nach meinem Studium keinen Job als Programmierer *gg*

Vampire

  • Beiträge: 52
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 11. August 2004, 15:53 »
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

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #15 am: 11. August 2004, 17:34 »
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
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

 

Einloggen