# Assembler Problem



## tsukasa02 (26. April 2007)

Hallo Leute 

Ich habe vor 2 Wochen angefangen in Assembler 86 zu Programmieren (Ich behersche schon zwei andere Programmier ssprachen), und wollte nun einen kleinen Taschenrechner Programmieren, doch leider bekomme ich es noch nicht einmal hin zwei zahlen zu addieren und sie auf dem Bildschirm auszugeben (das mit der ausgabe ist mir klar wie das geht), nur halt nicht wie ich es hinbekomme einer variable eine zahl zu kommen zu lassen, und diese als string  auf den Bildschirm auszugeben...

Ich hoffe das meine erklärung ausführlich genug war und ich eine antwort auf mein Problem erhalte

Mfg
Tsukasa02


----------



## mffm (28. April 2007)

Hallo,

vielleicht könntest Du den Code, den Du bereits hast, einmal posten, denn dann wäre es einfacher, das Problem zu lösen.

Gruß
Flo


----------



## tsukasa02 (29. April 2007)

> jmp begin
> 
> zahl1 dw ?
> zahl2 dw ?
> ...





so das ist mein code wie ich ihn bisher bei mir stehen habe


----------



## mffm (29. April 2007)

Ok, ich habe mir Deinen Code angeschaut, und mir sind da ein paar Sachen aufgefallen:


```
mov word zahl1, '0'
mov word zahl2,  '1'
```
Durch die Anführungszeichen werden nicht die Zahlen 0 und 1, sondern deren ASCII-Werte (48 bzw. 49) in den Speicher geladen, und später dann auch addiert, was so natürlich nicht erwünscht ist. Richtig wäre:


```
mov word zahl1, 0
mov word zahl2, 1
```
Außerdem hat mich diese Stelle ziemlich irritiert:


```
add zahl1,zahl2
```
Gab's damit keine Probleme? Meines Wissens funktioniert add doch nicht auf zwei Speicherstellen. Ich denke, es müßte z.B. so heißen:


```
mov ax, zahl1
add ax, zahl2
```
Gut, jetzt aber zum eigentlichen Problem, der Ergebnisausgabe. Du hast das so gelöst:


```
lea dx, zahl1
mov ah, 9
int 21h
```
Die Funktion 9 von Interrupt 0x21 ist dazu gedacht, einen String im Speicher, der mit dem $-Zeichen beendet wird, auszugeben. Das Ergebnis der Berechnung liegt aber als Binärzahl und nicht als String vor, deshalb ist diese Funktion ungeeignet. 
Die Funktion 2 von Interrupt 0x21 ist aber gut geeignet: damit wird das ASCII-Zeichen, das sich gerade im DL-Register befindet, ausgegeben. Damit kann das Ergebnis Ziffer für Ziffer ausgegeben werden. Vorher muß es aber noch in die einzelnen Ziffern zerlegt werden, indem man es durch 10 dividiert, den Rest der Division als hinterste Ziffer nimmt und danach mit dem ganzzahligen Rest weitermacht, bis dieser 0 ist.


Hier ist jetzt das vollständig korrigierte Programm:


```
jmp begin

zahl1   dw ?
zahl2   dw ?

begin:

mov word zahl1, 70
mov word zahl2, 123

mov ax, zahl1
add ax, zahl2

xor cx, cx
mov bx, 10

; Zerlegung in die einzelnen Ziffern
loop1:
  xor dx, dx
  div bx    ; Teilt DX:AX durch BX (also 10). Das Ergebnis ist in AX, der Rest in DX
  add dx, 30h ; ASCII-Darstellung der Ziffer
  push dx ; Ziffern auf dem Stack ablegen, damit sie später in umgekehrter Reihenfolge ausgegeben werden können
  inc cx

  cmp ax, 0
jne loop1

; Ausgabe
loop2:
  mov ah, 02h
  pop dx
  int 21h
loop loop2

mov ah, 08h
int 21h

mov ah, 4Ch
int 21h
```
 Ich hoffe, daß Dir das weiterhilft und alle Fragen damit beantwortet sind.

Gruß
Flo


----------

