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_AUS

    Hier 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: STRING1

    Bitte 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 Erickson

    Um 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.


Anmelden zum Antworten