mikrocontroller.net

Forum: PC-Programmierung erste Assemblerversuche: MASM funktioniert nicht.


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich beginne gerade Assembler zu lernen und habe den Assembler von 
Microsoft MASM als Assembler (und Linker) benutzt.

Leider funktioniert mein "Hallo Welt" Programm nicht, wie es soll.

Ich habe keinen Fehler im Quelltext gefunden, aber es funktioniert 
trotzdem nicht.

Eine Bemerkung noch: Ich benutze dummerweise Windows Vista als 
Betriebssystem.


Wer weiß, wo der Fehler liegt?

Thomas

Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sry. der Screenshot wurde nicht angenommen.

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch wenn ich mich nicht so sehr mit Assembler auf PC auskenne, wird es 
wohl an Vista liegen.
Für die Ausgabe auf der Konsole benutzt du ja nen DOS-Interrupt (Int 
21h). Da Vista aber keine DOS-Anwendungen mehr unterstützt kann ich mir 
gut vorstellen, dass der Interrupt einfach nimmer funktioniert.

Aber so 100% sicher bin ich mir da nicht.

MfG
Marius

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal
  mov ax, seg Meldung
statt
  mov ax, @data

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Marius Wensing: Ok. Funktioniert es denn wohl mit XP?

@Andreas Kaiser: Nein, das bringt nichts. :-(

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bevor du hier XP wieder rauskramst, kannst du das Programm ja einfach 
mal in der DOS-Box testen: http://www.dosbox.com/

Das Programm emuliert sozusagen nen kompletten DOS-PC mit allem drum und 
dran.
Wenns damit nicht funktioniert, dann weiß ich auch nicht, wo der Fehler 
noch zu suchen ist.

MfG
Marius

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir lässt es sich dann sowohl fehlerfrei übersetzen, als auch 
erfolgreich ausführen. Allerdings unter XP.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mh, komisch, ich habe es jetzt auch unter XP probiert es funktioniert 
nicht.

Angeblich wegen einem error A2006: undefined symbol: DGROUP (Zeile 6)

Was heiß das?

Thomas

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das heisst, dass
  mov ax, @data
so nicht funktioniert.

Warum nimmst du nicht einfach das Statement, mit dem man das seit 
Anbeginn der 8086-er gemacht hat?

Damit jedenfalls funktioniert es:
        .model  small
        .stack  100h
        .data
msg     db      "Hallo$"
        .code
start:  mov     ax, seg msg
        mov     ds, ax
        mov     dx, offset msg
        mov     ah, 09h
        int     21h
        mov     ah, 4ch
        int     21h
        end     start

[d:\src\test]a1
Hallo

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mh, klappt auch nicht:

Zeile 6: Error: A2004: symbol type conflict
Zeile 11: warning: A4023: with /coff switch, leading underscore required 
for start address: start

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn's unbedingt COFF sein muss, dann musst du ohne mich weiterraten. 
Mit dem zeitgemässeren OMF jedenfalls klappt das besser.

[d:\src\test]ml /omf /c a1.asm
Microsoft (R) Macro Assembler Version 7.10.2179
Copyright (C) Microsoft Corporation.  All rights reserved.

 Assembling: a1.asm

Wie man allerdings den Linker vom MASM32 zu Fuss passend aufruft, habe 
ich nicht parat. Ich habe das der Einfachheit halber dem Digital Mars 
Compiler und dessen Linker überlassen.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Entschulediung, aber ich bin Anfänger: Was ist Coff und was ist Omf?

Thomas

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
=> www.gidf.de

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm besser einen zeitgemäßen assembler, zB. nasm.
org 100h
mov si,hello

write:
lodsb
or al,al
jz ende
mov ah,0Eh
int 10h
jmp write

ende:
mov ah,4Ch
int 21h

hello db "HelloWorld!",10,13,0
(code irgendwo aus'm Netz geklaut)

http://nasm.sourceforge.net/

Wenn du dich erstmal mit assembler beschäftigen willst, wird das COM 
Format für dich besser geeignet sein weil unkomplizierter. Das Programm 
geht im Datensegment=Codesegment bei Offset 256 dez. = 100 hex los 
(daher das org 100h am Anfang), Unterteilung in Daten- und Codebereiche 
gibt es nicht, dynamische allokierung auch nicht. Du hast das gesamte 
Segment (=64kB-256 Byte) zu deiner Verfügung.

Noch eine Vorwarnung: Du programmierst da den x86 realmode. Der hat eher 
Ähnlichkeiten mit einem Taschenrechner als mit einer richtigen CPU, was 
du da lernst ist ein guter Einstieg, hat aber mit dem protected mode 
nicht viel gemeinsam.

Und noch ein Tipp: Ab dem 386er gibt's 32bit Register EAX, EBX usw. die 
gerade bei Division und Multiplikation angenehmer sind. In der NASM 
Befehlsübersicht findest du da mehr zu. Auf die Register kannst du auch 
im Realmode zugreifen.

Aufruf um 16bit COM Progs zu erzeugen: 
http://nasm.sourceforge.net/doc/nasmdoc7.html#section-7.2

Nimm das bin Format.

Autor: Moin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst den 16 Bit Linker.
Lnk562.exe

Autor: Ronny Minow (hobby-coder)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich stimme I_ H. zu. Mit dem NASM (Netwide Assembler) lässt es sich 
einfacher Progrmmieren. Viele Tutorials, die man im Netz finde, nutzen 
diesen Assembler. Im Übrigen: Hast Du, Thomas, passende Literatur um 
Assembler Programmierung erlernen zu können...?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob der wohl nach 23 Monaten diesen Thread noch liest?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.