Forum: Mikrocontroller und Digitale Elektronik Assembler (8086): Fakultät


von Elmo (Gast)


Lesenswert?

Hallo

Ich wüsste gerne, wie man ein Programm erstellt, das im Datenbereich
ein Array der Fakultät der Zahlen 0...8 erzeugt. (mit Eingabe und
Ausgabe (Mehrfachnutzung) und es soll erst beim Eintippen eine
Buchstabe (Bsp. Q) Abbruch geben)

Danke schön
MfG, Elmo

von Matthias (Gast)


Lesenswert?

Hi

Start:
    Daten einlesen (wenn Q dann Quit)
    In einer Schleife n! berechnen
    Ausgeben
goto Start

Da 8! noch in ein 2-Byte-INT passt sollte das mit den 16-Bit Registern
des 8086 kein Problem sein.

Matthias

von Elmo (Gast)


Lesenswert?

Hallo,

danke für die Antwort, die mir leider nicht weiter helfen kann, da ich
noch Probleme der Ein- und Ausgabe habe.
Ich bin eigentlich ganz neu in diesem Gebiet von
Assembler-Programmierung und ich kenne mich noch nicht so toll aus.

>Start:
>    Daten einlesen (wenn Q dann Quit)
>    In einer Schleife n! berechnen
>    Ausgeben
>goto Start

Es ist mir ja klar, da zuerst die Daten eingelesen werden müssen, aber
wie soll ich dann das machen?

meine ersten Überlegungen sind, dass ich eine Zahl (0...8) Bsp.8 nach
AX lade und und zuerst mit dem Inhalt 1 von einem anderen Register (BX)
multipliziere.
AX wird um 1 dekrementiert und wieder mit dem Inhalt vom BX (jetzt 8)
multipliziert und das soll solang gemacht werden, bis mein Zähler
(zähler=8) den Wert 1 hat erreicht hat.
aber ich weisse trotzdem nicht, wie ich das mit der Eingabe und Ausgabe
mache.


mov ax,8
mov bx,1
M1:
mul ax
dec ax
cmp ax,1
jg M1:
je M2:

M2:
mov ah,02h
mov dx,bx
add dx,??????

;hier ist auch ein Problem, da ich nicht weiss, was ich zu dx (addieren
(oder davon subtr. ) damit ich den Wert 40320 auf auf dem Bildschirm
bekommen kann !!?

MfG, Elmo

von OliverK (Gast)


Lesenswert?

Hallo Elmo,

das kommt mir etwas bekannt vor. Kann es sein, daß Du noch unter MS-DOS
arbeitest? Du willst jetzt mit

mov ah,02h
mov dx,bx
add dx,??????

eine Systemfunktion (Biosfunktion) aufrufen, um eine ASCII-Ausgabe auf
deinem Bildschirm zu erzeugen. Versuch mal ein altes PC-Intern 1.0 oder
2.0 Buch aufzutreiben (Bücherei?). Dort sind alle Betriebssystem- und
Biosfunktionen ausführlich dargestellt.


Grüße
Oliver

von Elmo (Gast)


Lesenswert?

Hallo,

das Programm läuft jetzt bei mir, aber ich weiss nicht, ob es jetzt das
richtige Programm ist, was eigentlich von mir verlangt wurde ...
es kann sein, dass ich die Aufgabestellung falsch verstanden habe.

Das Programm soll im "DATENBEREICH" ein "ARRAY" der Fakultät der
Zahlen 0...8 erzeugen.

ich habe's jetzt so gemacht, dass wenn ich eine Ziffer zwischen 0 und
8 eintippe bekomme ich gleich die Fakultät raus !!!

Ist das jetzt das richtige was mit ARRAY gemeint wurde ???

MfG

von Johannes Raschke (Gast)


Lesenswert?

Hi!

Nö, das war wohl etwas anders gemeint, aber Du kannst Dein Programm
bestimmt leicht entsprechend erweitern.

Die wollen, daß Du erstmal 8 Bytes Speicher reservierst (im .DATA
Segment mit .db) und dann am Programmstart die Fakultäten von 1, 2,
..., 8 berechnest und nacheinander in diesen Speicherbereich schreibst.
Dann gehst Du in eine neue Schleife: Auf Zahlenengabe warten, Ascii -
Wert umwandeln in Zahl 0-7, entsprechenden Fakultäts - Wert aus dem
Speicher holen und ausgeben. Vorher prüfen, ob statt einer Zahl "q"
eingegeben wurde.

Der Ansatz von Matthias ist also nicht ganz richtig.

Ich würde Dir das Buch "Assembler Programmierung" aus dem Franzis´
Verlag empfehlen, damit habe ich es recht schnell gelernt...

von Elmo (Gast)


Lesenswert?

Hallo,

ich habe jetzt ein Teil des Programms geschrieben, aber ohne Ein- und
Ausgabe, womit ich jetzt (in diesem Fall) Probleme habe und weiss
nicht, wie es weiter geht :-( !!!



;********************************************************************
; Definition der Konstanten
Lf          equ     0Ah
Cr          equ     0Dh

; Code Segment definieren
_TEXT       segment
            assume CS:_TEXT, DS:_TEXT, SS:_TEXT
            org    100h            ;COM-Programm beginnt bei Offset
100h

; Programmbereich

Start:    mov     BX, 0           ; Zaehler für Zeiger auf Erg
          mov     AX, 1           ; Fakultaet für 0 wird vorgegeben
          mov     DI, 8           ; Zaehler für Schleife
          mov     CX, 0           ; Zaehler für Multiplikation
          lea     SI, Erg         ; Zeiger auf Speicherstelle Erg

L1:       mov     [SI+BX], AX   ;Akkuinhalt wird in Speicher abgelegt
          dec     DI            ;DI wird um 1 verringert
          jz      Ende          ;Wenn Schleife 8mal durchlaufen->Ende
          add     BX, 2         ; Zeigerdisplacement wird um 2 erhöht
          inc     CX            ; Erh”hung CX um 1
          mul     CX            ; AX * CX = AX
          jmp     L1            ; Unbedingter Sprung nach L1

Ende:       mov     al, 0           ; Fehlercode 0
            mov     ah, 4Ch         ; Funktion: Programm verlassen
            int     21h             ; Schnittstelle zu DOS
;********************************************************************
; Datenbereich

Erg         dW      8 DUP(?)

_TEXT       ends                    ; Codesegment schlieáen
            end     Start           ; Ende des Quellprogramms
;********************************************************************


Gruss

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
Noch kein Account? Hier anmelden.