masm mag extern und public nicht
-
Ich hab da n Problem mit nem Code den ich (wahrscheinlich bis auf Tippfehler) 1zu1 aus meinem Buch übernommen habe. Masm mag es nicht. Er hat Probleme mit public und extern.
Hier der Code von test.asm:
public string1 extern string_aus : far daten segment string1 db "Scheisemistdämlicher", "$" daten ends stapel segment db 128 dup(?) stapel ends code_hp segment assume cs:code_hp, ds:daten, ss:stapel anfang: mov ax, daten mov ds, ax call string_aus call end_prg end_prg proc near mov ah, 4ch int 21h end_prg endp code_hp ends end anfang
Hier der Code von print.asm:
extern string1:byte public string_aus code_up segment assume cs:code_up string_aus proc far lea dx, string1 mov ah, 9 int 21h ret string_aus endp code_up ends end
Hier die ausgaben beim assemblieren von test.asm:
test.asm(2): error A2105: Expected: instruction, directive, or label
test.asm(17): error A2009: Symbol not defined: STRING_AUSHier die ausgaben beim assemblieren von print.asm:
print.asm(1): error A2105: Expected: instruction, directive, or label
print.asm(8): error A2009: Symbol not defined: STRING1Bitte gebt mir ne Chance ich hab mir größte mühe gegeben ein sauberes Protokoll zu liefern.
-
Liegt an folgender Zeile, die hoffentlich nicht so im Buch steht.
string1 db "Scheisemistdämlicher', "$'
Lösung:
string1 db "Scheisemistdämlicher", "$"
-
Welche Masm Version, welcher Linker, welches Betriebsystem?
Es gibt mehrere masms, für 16bit, für 32bit, für 64bit, ältere, neuere, hutchs masm32, usw.
Hier schreiben eine ganze Menge Einsteiger rein, die beim Übersetzen alter 16bit Programme mit unterschiedlichen Masm- und Betriebsversionen Probleme haben.
Man kann die Segmentierung weglassen, aber der gepostete Code ist ja gerade dazu da, Segmentierungsgeschichten bzw. alte Masm-Grammatik zu üben. Dazu sollte aber ein 16bit masm eigesetzt werden.
Falls du auf die Segmentierung verzichten kannst, reicht es, das Programme im COM-Format zu schreiben.
Der recht Einsteigerfreundliche flatassembler fasm: http://www.flatassembler.net/ erledigt das ganz ohne Linker und Rückformatierung.
Wie das geht, sieht man in den Beispielen der Dos-Version von fasm.Wenn du die Segmentierung oder eben die alte Masm-Grammatik wirklich üben musst, dann sieh dich nach 16bit Versionen von Masm und Tasm um und versuch mit denen nochmal dein Glück. Falls du nichts findest, melde dich nochmal. Ansonsten:
EinGast schrieb:
Liegt an folgender Zeile, die hoffentlich nicht so im Buch steht.
string1 db "Scheisemistdämlicher', "$'
Lösung:
string1 db "Scheisemistdämlicher", "$"
Das ist nur ein Darstellungsfehler der Forenseite, den gibt es schon lange.
ABER: stand in dem Buch wirklich extern, oder EXTRN?
-
Für Funktionen würde ich PROTO benutzen:
string_aus PROTO far
Für Variablen empfiehlt sich EXTERNDEF name:type <,name:type ...>
(public & extern/extrn können z.B. nicht in includes Verwendete werden)
-
Nachtfeuer: ok ne es stand nicht extern sondern extrn, … doofe Sache. Hm ich hab den masm Assembler für DOS bei der Dosbox. Aber … ich hab nicht fiel Lust Assembler für den 8086 unter DOS zu programmieren. Mir wäre as, Assembler Amd64 unter Linux lieber. Leider ist mein Buch sehr kurz, und es wird nur der real Mode beschreiben. Kennt jemand ein Buch das an der stelle mehr leisten kann? Am besten auch eins das gleich das Programmieren von Assembler in C Programmen näher erklärt. Da mein Buch nur 2 Seiten darüber verliert. (Mir is klar das man Assembler in C nicht mehr braucht. Ich will es aber dennoch lernen.)
-
BigGreenFoot schrieb:
Mir wäre as, Assembler Amd64 unter Linux lieber.
Der wichtigste Grund, mit DOS einzusteigen, ist für mich vor allem, um mit dem Dosprg debug zu arbeiten. Und man hat in DOS/Realmode so ziemlich alle Freiheiten zum Assemblerprogrammieren, die in Unix und Windows so nicht gegeben sind und viel Literatur inkl. viele interessante Dosviren zum Erlernen der Programmiertechnik zur Verfügung. Maßnahmen zum Speicherschutz, wie der Protected Mode des Pentium, verteht man nicht so gut, wenn man nicht weiß, worauf dieser aufbaut bzw. nicht selber eine Interruptvektortabelle überschreiben kann. Und wenn man seine selbstgeschriebenen Sachen mit IDA disassembliert, dann sehen Dosprogramme sehr viel übersichtlicher aus.
Wie der Stack arbeitet, lernt sich an einem selbstgeschriebenen Dos-Programm leichter, als über Parameterübergabevorlieben von Hochsprachen und Hochsprachen-Betriebssystemen.Aber auch wenn man gleich mit Linuxasm einsteigen möchte, ist das Assemblerbuch von Backer nicht sinnlos geworden, denn es werden viele praktische Techniken vorgestellt. Man muß nur wissen, wie man sie nach Linuxasm übersetzen kann und hat dann schon einiges gelernt.
Ein englischsprachiges Buch, welches dabei hilft, gibt es von Jonathan Bartlett:
http://download.savannah.gnu.org/releases/pgubook/ (aber etwas trocken)
dann noch ein Buch wie das hier:
http://seesee.pbworks.com/f/linux.pdf
(und natürlich Sourcecodes, Disassembler und Debugger zum Analysieren von Funktionen)Deutschsprachige Bücher die noch weiterhelfen sind u.a.:
Assembler: Grundlagen der Programmierung
von Joachim Rohde und Marcus Roming
und
Hacking: Die Kunst des Exploits
von Jon EricksonUm mit Debug zu arbeiten, helfen Debugtuts aus dem Internet weiter, z.B. das kleine Tut von Prof. Weber:
http://134.108.191.1/vorl/rt2/debug.pdf
Man hat im Virtual Mode zwar kein 64bit zur Verfügung, aber 128bit oder 256bit für 32bitproggis dürften schon machbar sein
-
Ok dann wert ich mal nach Anweisung, das Buch vom Bäcker^^ fertig machen, und dann mal schauen wie ich weiter mach.