NASM Syntaxproblem
-
Hallo,
habe schon gesucht und gesucht und rumprobiert, aber ich bekomme folgendedrei Zeilen nicht in NASM code umgesetzt. Weiß einer von euch, wie das richtig sein muss? Danke!b equ byte ptr w equ word ptr d equ dword ptr
-
Moin sevobal,
um unter NASM den Datentyp bei indirekter Adressierung anzugeben, benutzt Du byte, word, dword (ohne Ptr), also
mov byte [ebx], 0xff mov word [ebx], 0xffff mov dword[ebx], 0xffffffff
Du kannst statt equ %define benutzen:
%define b byte %define w word %define d dword
Ciao...
-
cool, danke hat alles bestens geklappt, bis auf diese eine sache, damit komme ich noch nicht ganz klar:
gdt_adr GDTSTRUC ?
DANKE!
-
Moin sevobal,
die Benutzung von Strukturen ist unter NASM etwas gewöhnungsbedürftig(für meinen Geschmack zumindest).
Definition einer Struktur:
struc GDTSTRUC .limit resw 1 .base resd 1 endstruc
Eine Instanz erzeugen:
gdt_adr: istruc GDTSTRUC at GDTSTRUC.limit, dw 24 ; Größe der Deskriptortabelle in Bytes(hier: 3 Einträge á 8 Bytes) at GDTSTRUC.base, dd Adresse_der_Deskriptortabelle iend
Die Instanz der Struktur wird mit gdt_adr angesprochen.
Ciao...
-
ql danke, ist in der tat eine wenig gewöhnungbedürftig....ich habe in der doc von nasm gestöbert und dort den hinweis gefunden, dass der befehle assume: nicht unterstützt wird und ich habe dort auch keine ersatz befehl gefunden....gibts da auch keinen?
-
Moin sevobal,
nein, tatsächlich kennt NASM die Direktive assume nicht. Es gibt auch kein Ersatz dafür. Hier liegt mehr Verantwortung beim Programmierer, der Acht geben sollte, welche Werte in die Segmentregister geschrieben werden. Eigentlich braucht man assume auch nicht, ist halt eine nette Unterstützung seitens des Assemblers.
Ebensowenig unterstützt NASM übrigens die Speichermodelle. Auch hier muss der Programmierer mehr Hand anlegen und wissen, was er macht(bei Sprungbefehlen etc).
Ciao...
-
gut zu wissen, bleibt nur noch:
LGDT gdt_adr
warum akzeptiert der assembler das net und sagt mir das sei eien ungültige Kompination von Opcode...?
achja und da ist noch was mit der stack structur, im handbuch steht zwar, dass es den befehl segment stack gibt, aber wird auch net akzeptiert....
-
Moin sevobal,
die Anweisung muss lauten:
lgdt [gdt_adr]
Die eckigen Klammern bewirken, dass der Inhalt der Speicherzellen, auf die der Zeiger gdt_adr zeigt, in das Register geladen wird.
Ohne die Klammern würdest Du versuchen den Wert des 32-Bit-Zeigers(nämlich gdt_adr)selber in das Register zu laden. Das kann natürlich nicht klappen, denn es wird ja ein Zeiger auf die Kombination von 16-Bit Limit und 32-Bit Adresse erwartet.
Ciao...