Lowlevel
OffZone => Offtopic => Thema gestartet von: bscreator 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 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 ?
-
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?
-
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.
-
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.
-
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?
-
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
-
Und woher weiß fasm, was ich an der Stelle gerade meine?
-
Naja, Kristallkugeln sind inzwischen recht verbreitet. :P
-
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.).
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
-
@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:
-
@bluecode: Wie jetzt? :-o
-
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).
-
@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
-
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.
-
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.
-
@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
-
@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.
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.
-
@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
-
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
-
@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...
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...
-
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...
Hä? Var ist doch keine Variable mit vordefinierter Größe also muss man dem fasm sagen, welche Größe man haben möchte sonst gibt er eine Fehlermeldung aus. Und damit wäre dein NASM-Vorteil hinfällig. Aber ich meine natürlich dword, sorry.
bitmaster
-
@taljeth: Wie du weißt nicht mehr was du sagen sollst? So geht das aber nicht. :-P
bitmaster
-
Es macht die Sache nicht besser, wenn es an manchen Stellen geht und an anderen nicht. ;)
Davon abgesehen langweilt mich diese Diskussion, am Ende ist man sich doch wieder nur einig, daß man unterschiedlicher Meinung ist...
-
OK, ich merke schon du kannst eine Diskussion nicht verlieren (im sinne von nicht wollen). Na ja, dann würdest du zu uns passen. ^^ *duck und ganz ganz schnell weg*
bitmaster
-
Haha...bitmaster: Merkst du eigentlich auch was du für Sachen schreibst? Sorry aber das entspricht echt nicht dem Niveau hier...
Gruss
Noooooooooos
-
Haha...bitmaster: Merkst du eigentlich auch was du für Sachen schreibst? Sorry aber das entspricht echt nicht dem Niveau hier...
Gruss
Noooooooooos
Äh wieso? Was habe ich denn schlimmes geschrieben? Auf jeden Fall finde ich den Fasm besser. Aber naja, dass muss, wie taljeth schon sagte, jeder selber wissen. Und das taljeth zu uns passen würde war eher ein Scherz. Zu den roten passen nur rote. Mit Klinsi haben wir ja schon genug nicht rote bei uns. Na ja ...
bitmaster
-
Äh wieso? Was habe ich denn schlimmes geschrieben?
Du hast überhaupt nichts schlimmes gesagt, es war nur nicht alles so geistreich.
Auf jeden Fall finde ich den Fasm besser. Aber naja, dass muss, wie taljeth schon sagte, jeder selber wissen.
Damit meine ich nicht das Gespräch über das Thema, wie hier...
Und das taljeth zu uns passen würde war eher ein Scherz. Zu den roten passen nur rote. Mit Klinsi haben wir ja schon genug nicht rote bei uns. Na ja ...
...aber sowas schon....
Gruss
Noooooooooooos