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
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
Probier mal mov ax, seg Meldung statt mov ax, @data
@Marius Wensing: Ok. Funktioniert es denn wohl mit XP? @Andreas Kaiser: Nein, das bringt nichts. :-(
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
Bei mir lässt es sich dann sowohl fehlerfrei übersetzen, als auch erfolgreich ausführen. Allerdings unter XP.
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
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:
1 | .model small |
2 | .stack 100h |
3 | .data |
4 | msg db "Hallo$" |
5 | .code |
6 | start: mov ax, seg msg |
7 | mov ds, ax |
8 | mov dx, offset msg |
9 | mov ah, 09h |
10 | int 21h |
11 | mov ah, 4ch |
12 | int 21h |
13 | end start |
[d:\src\test]a1 Hallo
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
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.
Entschulediung, aber ich bin Anfänger: Was ist Coff und was ist Omf? Thomas
Nimm besser einen zeitgemäßen assembler, zB. nasm.
1 | org 100h |
2 | mov si,hello |
3 | |
4 | write: |
5 | lodsb |
6 | or al,al |
7 | jz ende |
8 | mov ah,0Eh |
9 | int 10h |
10 | jmp write |
11 | |
12 | ende: |
13 | mov ah,4Ch |
14 | int 21h |
15 | |
16 | 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.
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...?
Ob der wohl nach 23 Monaten diesen Thread noch liest?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.