# Fragen zu Assembler



## BlueB (26. Juni 2004)

Ich habe vor einer Woche angefangen Assembler zu lernen.
Jetzt wollte ich mal ein Programm programmieren, dass den Kreisumfang berechnet.
Unter .data  habe ich
pi db 3,1415 
durchmesser db 0 
umfang dd durchmesser*pi 

geschrieben.

der Durchmesser sollte dan so bestimmt werden:
   mov ah,01 
   int 21h 

   mov [durchmesser],al

Dann wollte ich den Umfang ausgeben:
   mov ah,09
   mov dx,offset umfang
   int 21h

Der TASM mach das aber nicht.
Was muss man da machen, wenn das nicht funktioniert?


----------



## Uranus (26. Juni 2004)

1. pi db 3,1415 (bzw 3.1415) kannst du nicht in ein BYTE speichern (Kommazahlen sind sowieso etwas komplizierter)
2. im Datensegment kannst du nichts berechnen
3. al ist nur 1 Byte groß. Du willst aber seinen Inhalt auf die Adresse eines Doppelwortes schreiben.
Entweder machst du:
durchmesse als db 
oder du nimmts: 
mov durchmesser, al
4. wenn du eine Zeichenkette mit 09h ausgeben willst muss diese mit einem $ terminiert werden.
5. Zeichenketten müssen als db definiert werden
Bsp.: string db 'das ist ein string$' oder string db 'String mit Zeilenumbruch',10,13,'$'


----------



## BlueB (26. Juni 2004)

*Antwort von Uranus*

Danke Uranus

Dann noch mal ein paar Fragen
z.b.:

DOSSEG 
.model small 
.stack 100h
.data
pi ... 3,1415
Umfang dw 0 
.code 
mov ax,@data
mov ds,ax

mov ah,01
int 21h 

mul pi
mov Umfang,ax 

1.Wie kann man einer Variable einen Wert geben, der eine pos. rationale, gebrochene Zahl ist?

2.Wie könnte man jetzt "Umfang ausgeben?

3.Wenn man eine Zeicheneingabe mit 01 in ah macht, werden immer ascii Zahlen in al gespeichert. Wie kann man das machen, dass bei z.b.:1auch 1 und nicht 61 gespeichert wird?


----------



## Uranus (26. Juni 2004)

1. Das is ne gute Frage da muss ich mich selber erstmal schlau machen.  

2. Das kann sehr komplex werden ;-) am einfachsten is es wenn man einen String hat in dem man das Ergebnis schreibt. Allerdings ist das Ergebins ja meist ein Kommazahl d.h. es wird schon wieder kompliziert 
 

3. 
0 = 30h
9 = 39h
d.h. du ziehst einfach 30h von al ab und hast deine Zahl

Kannst du es nich erstmal mit einfach sachen versuchen wie 2 Dimensionale Arrays adressieren


----------



## squeaker (28. Juni 2004)

um mit reellen Zahlen zu arbeiten, musst du mit der FP-Einheit programmieren.

Frage: muss es unbedingt ein DOS-Programm sein? sonst würde ich dir sowieso empfehlen auf win32 umzusteigen (ist mit dem Speicher einfacher).

Google mal nach "Art of Assembly" - ist ein kostenloses Assemblerbuch (gibt's in 3 Ausführungen 16bit, 32bit win und 32bit linux).

Da steht auch drin wie man mit der fp-unit arbeitet.


----------

