Autor Thema: Kleine Frage zu NASM...  (Gelesen 17175 mal)

bscreator

  • Gast
Gespeichert
« am: 13. January 2008, 18:03 »
Hallo OS-Coder,
mal ne kleine Frage zum NASM-Assembler:
Ist es eigentlich möglich, den Wert einer zuvor definierten und initialisierten Variablen zu ändern ?
Ich frag nur, weil in jedem tollen ASM-Buch steht, dass Operationen wie
mov Zaehler,ah ;oder
add Zaehler,20
zulässig sind. Allerdings scheint da NASM irgendwas dagegen zu haben, denn es antwortet immer mit
Zitat
Invalid combination of opcode and operands
, sprich die beiden Strukturen passen nicht zusammen.
Was aber im Prinzip nicht sein kann, denn Zaehler wurde zuvor mit db 0 initialisiert.
Wisst ihr, was da los ist ?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 13. January 2008, 18:11 »
Disclaimer: Ich benutze vernünftige Sprachen und kenne mich daher mit Assembler, erst recht in der Falschrum-Variante nicht aus.

Müßte es nicht mov [Zaehler], ah heißen?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bscreator

  • Gast
Gespeichert
« Antwort #2 am: 13. January 2008, 18:20 »
Stimmt, hast natürlich recht. Da müsst ihr entschuldigen, dass ich wegen solchen billigen Fragen auftauche, aber wenns im Studium ständig nur um C++ und OOP geht, dann vergisst man ASM ziemlich schnell.
Danke jedenfalls.

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 13. January 2008, 18:43 »
Btw, "add [Zaehler], 20" würde auch nicht funktionieren, da NASM den Typ von Labels nicht speichert. Nasm weiß nichts davon, dass du Zaehler mit db 0 initialisiert hast, Zaehler ist einfach nur eine Addresse für NASM. NASM verlangt Prefixe wie "add byte [Zaehler], 20", wenn die Größe des Speicherzugriffs nicht durch ein Register bestimmt ist.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 13. January 2008, 21:34 »
Stimmt, hast natürlich recht. Da müsst ihr entschuldigen, dass ich wegen solchen billigen Fragen auftauche, aber wenns im Studium ständig nur um C++ und OOP geht, dann vergisst man ASM ziemlich schnell.
Warum benutzt du dann nicht eine Hochsprache für dein OS, wenn du dich damit besser auskennst?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #5 am: 14. January 2008, 15:13 »
Btw, "add [Zaehler], 20" würde auch nicht funktionieren, da NASM den Typ von Labels nicht speichert. Nasm weiß nichts davon, dass du Zaehler mit db 0 initialisiert hast, Zaehler ist einfach nur eine Addresse für NASM. NASM verlangt Prefixe wie "add byte [Zaehler], 20", wenn die Größe des Speicherzugriffs nicht durch ein Register bestimmt ist.
Genau aus diesem Grund finde ich fasm besser als nasm.

bitmaster
In the Future everyone will need OS-64!!!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 14. January 2008, 16:14 »
Und woher weiß fasm, was ich an der Stelle gerade meine?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #7 am: 14. January 2008, 17:31 »
Naja, Kristallkugeln sind inzwischen recht verbreitet. :P

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #8 am: 14. January 2008, 17:47 »
Wenn du folgende Variable hast:

Beispiel dq 0
Dann brauchst du unter Fasm nur dass zu schreiben:

mov [Beispiel],Wert
Nasm kann damit aber nichts anfangen und erwartet ein:

mov qword [Beispiel],Wert
was in meinen Augen unnötig ist. Es ist zwar nichts schwerwiegendes, aber es hat bei mir schon für Fehler gesorgt (q bei qword vergessen oder später die Größe der Variable geändert und nicht an alle Stellen im Code angepasst etc.).

Zitat
Und woher weiß Fasm, was ich an der Stelle gerade meine?
Weil einfach standardmäßig die Definierte Größe genommen wird (im Beispiel also QWORD) ansonsten geht natürlich auch eine explizite Angabe.

@FreakyPenguin: Was du damit jetzt sagen willst weiß ich nicht.

bitmaster
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #9 am: 14. January 2008, 18:29 »
@FreakyPenguin: Was du damit jetzt sagen willst weiß ich nicht.
Damit will er sagen, dass der Assembler nur in die Kristallkugel schauen muss und dort wird er natürlich die richtige Operandengröße sehen :wink:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #10 am: 14. January 2008, 18:54 »
@bluecode: Wie jetzt?  :-o
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #11 am: 14. January 2008, 20:11 »
Kein Humor heute, oder? :roll: :wink:

Normalerweise sagt man sowas wie "ich hab meine Kristallkugel verlegt" (1), "Ein Blick in die Kristallkugel sagt mir, ..." (2) oä. in Programmiererforen wenn der Threadersteller total unzureichende Angaben über sein Problem bzw. die Umstände eines Problems macht und eine Problemlösung nicht möglich ist (1). Teilweise wird dann von den Antwortenden erraten was das Problem bzw. die Umstände eigentlich sind (2).
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #12 am: 14. January 2008, 20:25 »
@bluecode: Und an welcher Stelle ist das hier der Fall. "bscreator" hat Bücher gelesen, die von TASM/MASM-Syntax  ausgehen und Nasm kann mit dieser nicht umgehen, da er eine andere Syntax verwendet. Wo muss man da raten?

NASM/FASM:
mov si,var ;Offset der Variable var nach si kopieren
mov si,[var] ;Wert der Variable var nach si kopieren

TASM/MASM:
mov si,offset var ;Offset der Variable var nach si kopieren
mov si,var ;Wert der Variable var nach si kopieren

bitmaster
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #13 am: 14. January 2008, 20:30 »
Du weißt, dass die eigentliche Frage von taljeth kam und nicht von mir oder? :wink: Ich hab dir nur erklärt, was freakys Kommentar bedeuten soll.

Mir ist klar, dass man aus der Definition einer Variable wenn sie in dieser Übersetzungseinheit (falls sie woanders ist geht das mit etwas extern syntactic sugar bestimmt auch, kA ob das fasm macht) ist die Größe herausfinden kann.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 14. January 2008, 22:23 »
Und ich bin der Meinung, daß es äquivalent sein sollte, ob ich viermal db oder einmal dd schreibe. Daher halte ich es für gefährlich, daß der Assembler einfach irgendeine Annahme trifft, was ich wohl gemeint haben könnte. Wenn ich Pech habe, liegt er mit dieser Angabe nämlich daneben.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #15 am: 14. January 2008, 22:29 »
@taljeth: Du kannst es ja auch wie unter Nasm angeben. Und wenn jemand

var db 0
db 0
db 0
db 0

schreibt, dann ist er entweder Behindert oder weiß nicht, dass es ein dd gibt.

bitmaster
In the Future everyone will need OS-64!!!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 14. January 2008, 22:46 »
@taljeth: Du kannst es ja auch wie unter Nasm angeben.
Ich kann. Aber wenn ich es vergesse, werde ich nicht daran erinnert. Aber du hast ja damals schon nicht eingesehen, daß es etwas gutes ist, wenn ein Compiler viel meckern kann, weil die Syntax streng ist.

Zitat
Und wenn jemand
var db 0
db 0
db 0
db 0
schreibt, dann ist er entweder Behindert oder weiß nicht, dass es ein dd gibt.

Oder er wollte klarmachen, daß hier logisch vier verschiedene je ein Byte große Zahlen vorliegen, die nur irgendeine Hardware ausgerechnet als dword haben will.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #17 am: 14. January 2008, 23:20 »
@taljeth: Jo klar, deswegen proggst du ja auch in C. ^^

Na ja, das kann man schon so sehen. Aber ich persönlich bevorzuge das, was Fasm macht. Denn ich habe keine Lust unnötigerwiese byte, word, dword, qword etc. zu schreiben obwohl es durch die Definitionsgröß bereits bekannt ist. Und wenn ich wie du sagst, die Definitionsgröße doch anders haben möchte, dann bin ich auch so schlau und denke daran, diese entsprechend anzugeben.

bitmaster
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #18 am: 14. January 2008, 23:26 »
Oder er wollte klarmachen, daß hier logisch vier verschiedene je ein Byte große Zahlen vorliegen, die nur irgendeine Hardware ausgerechnet als dword haben will.

Zumal man den 4 Variablen dann auch allen einen neuen Namen geben darf und somit sauberer programmiert:

Var:
var0 db 0
var1 db 0
var2 db 0
var3 db 0

Dann darf der eine Code schön die varX einzeln ansprechen und der andere z.B. ein mov eax, qword [Var] machen.

:-P

bitmaster
In the Future everyone will need OS-64!!!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 14. January 2008, 23:29 »
@taljeth: Jo klar, deswegen proggst du ja auch in C. ^^
Nein, das hat mehr mit einer Art kleinstem gemeinsamen Nenner zu tun. C ist nämlich an manchen Stellen auch nicht gerade ungefährlich...

Zitat
Dann darf der eine Code schön die varX einzeln ansprechen und der andere z.B. ein mov eax, qword [Var] machen.
Und wenn das qword bei [Var] nicht angegeben ist, weil das ja bekanntermaßen eine qword-Variable (naja, eigentlich dword, aber du hast ja den falschen Typ benutzt...) ist? Ups...
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen