Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Assembler [MASM32] Variabele; Frage


HeinzKarl - Sa 12.02.11 23:03
Titel: Assembler [MASM32] Variabele; Frage
Hi Leute,

ich habe mir vor kurzem mal MASM32 (10te Version oder so^^) heruntergeladen. Nun habe ich das klasische 'Hallo Welt' geschrieben. Naja eher hat mir der Compiler den Code vorgegeben :)

Ich wollte ihn um eine Variabele erweitern, diese festlegen und ausgeben.

Nun meine Fragen:

- Was ist an dem Code falsch ? Ich finde soweit keinen Fehler
- Wie gebe ich jetzt die Variabele aus ?


Mein Code bis jetzt :


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
  
include \masm32\include\masm32rt.inc


    .data?        <- Wozu ist das ?
      value dd ?  <- und das ? Ich habe ja unten noch eine Data Sektion.
      

    .data
      item dd 0   <- Das war vorgegeben, was das ? Ich hab geschaut, angeblich DoubleWord ??
      vari db (123) <- Meine Variabele

    .code

start:
   

    call main
    inkey
    exit

main proc

    cls
    print "Hello World",13,10
    print "Neue Zeile, und eine Zahl : ",13,10
    mov dx, vari  <- Das hier soll die Variabele ausgeben, geht aber nicht! 
    INT 21h       <- Und das ist halt die endgültiger Ausgabe
    ret

main endp


end start


BenBE - So 13.02.11 01:56

user profile iconHeinzKarl hat folgendes geschrieben Zum zitierten Posting springen:
Hi Leute,

ich habe mir vor kurzem mal MASM32 (10te Version oder so^^) heruntergeladen. Nun habe ich das klasische 'Hallo Welt' geschrieben. Naja eher hat mir der Compiler den Code vorgegeben :)

Ich wollte ihn um eine Variabele erweitern, diese festlegen und ausgeben.

Nun meine Fragen:

- Was ist an dem Code falsch ? Ich finde soweit keinen Fehler
- Wie gebe ich jetzt die Variabele aus ?


Mein Code bis jetzt :


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
  
include \masm32\include\masm32rt.inc


    .data?        <- Wozu ist das ? (.bss dürfte identisch sein)
      value dd ?  <- und das ? Ich habe ja unten noch eine Data Sektion. (Uninidialized Value)
      

    .data
      item dd 0   <- Das war vorgegeben, was das ? Ich hab geschaut, angeblich DoubleWord ??
      vari db (123) <- Meine Variabele

    .code

start:
   

    call main
    inkey
    exit

main proc

    cls
    print "Hello World",13,10
    print "Neue Zeile, und eine Zahl : ",13,10
    mov dx, vari  <- Das hier soll die Variabele ausgeben, geht aber nicht! 
Hier fehlt noch das Setzen des Funktionsaufruf für das schreiben in AX
    INT 21h       <- Und das ist halt die endgültiger Ausgabe
    ret

main endp


end start


Naja, nehmen wir das mal etwas auseinander:
Der Int 21h stellt zahlreiche Funktionen bereit, die über das AH/AX-Register angesprochen werden. Hierzu gehört das schreiben von STRINGS auf die Standard-Ausgabe, Lesen von Strings von der Standard-Eingabe und zahlreiche andere Dinge. Was der int 21h NICHT kann, sind Zahlen direkt ausgeben (AFAIR). Hierzu musst Du selber tätig werden und deinen Wert in DX in einen String verwandeln. die normale String-Ausgaberoutine will übrigens in DX den Zeiger auf den Anfang des Strings haben; und nicht deine Zahl.


HeinzKarl - So 13.02.11 12:48

So, ich habe es jetzt mal einen String gespeichert. Geht immernoch nciht. Ich bekomme die Fehlermeldung
"invalid instruction operands"


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
das schreiben von STRINGS auf die Standard-Ausgabe
--------------------------------------------------
  vari db 'Entwickler Ecke' <- String 

    .code

start:
   

    call main
    inkey
    exit

main proc

    cls
    print "Hello World",13,10
    mov dx, vari 
    mov ax,dx <- von dx nach ax ? 
    INT 21h <- Ausgabe ax ?
    ret

main endp



Sorry für die Anfänger fragen, aber ich steh grad echt aufm Schlauch O.o



So habe grade mal ein bischen rumprobiert und es geschafft eine andere Fehlermeldung zu bekommen :D

Also das habe ich geändert :


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 
main proc

    cls
    print "Hello World",13,10,'$'
    mov ah,09h
    mov dx,OFFSET var
    INT 21h
    ret

main endp


Fehler : "instruction operands must be the same size"


BenBE - So 13.02.11 14:04

Das Offset kannst Du weglassen in dem Fall, da var nur ein Label bezeichnet und damit eine Referenz auf eine Speicherzelle darstellt.


HeinzKarl - So 13.02.11 14:15

*durchdreh*

Ich habe jetzt das OFFSET weggelassen und habe jetzt diesen Code und bekomme trotzdem wieder einen Fehler !


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
    
include \masm32\include\masm32rt.inc

    .data?
      value dd ?
      
    .data
      item dd 0
      var db 'Entwickler Ecke',13,10,'$'

    .code

start:
   

    call main
    inkey
    exit

main proc

    cls
    print "Hello World",13,10,'$'
    mov ah,09h
    mov dx,var <- !Fehler! "invalid instruction operands" Was mache ich denn noch falsch o.O ?
    INT 21h
    ret

main endp


end start