erste Assemblerversuche: MASM funktioniert nicht.

Gast #910914
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
#910949
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
#911016
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:
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
#911043
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.
#911740
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren