un programma in linguaggio assembly 8085 per trovare il fattoriale di un numero

StackOverflow https://stackoverflow.com/questions/2455690

  •  20-09-2019
  •  | 
  •  

Domanda

Voglio trovare fattoriale di un numero che prendo la memoria prima. (Intel 8085)

Edit: sto principiante. non so come scrivere sia i codici di assemblaggio.

pseudo codice:

input n
fact = 1
loop:
..multiply fact by n
..decrement n
..test n
..jump if not zero to loop
output fact
È stato utile?

Soluzione

In primo luogo, è meglio imparare a scrivere 8085 se si prevede di utilizzarlo. Assembler, in particolare per i vecchi microprocessori a 8-bit, non è qualcosa che si può solo prendere il software in scatola e patch.

In secondo luogo, esattamente ciò che stai usando per i numeri? Il 8085 ha un bus a 8 bit e può utilizzare come registri 16 bit. Se sei limitato a numeri a 16 bit, è possibile utilizzare una tabella di ricerca, come non si può rappresentare 9! in ogni caso.

In terzo luogo, se si sta facendo nel modo algoritmico, si potrebbe desiderare di guardare prima in quello che si sta utilizzando per la moltiplicazione. 8085 non ha moltiplicazione on-chip. (Una volta ho vinto un concorso per la moltiplicazione precisione multipla e la divisione con la Z80, che aveva alcune caratteristiche del 8085 non ha avuto. In particolare, sono stato in grado di utilizzare il banco di registri alternativo per fare alcune cose utili.)

Altri suggerimenti

con un processore Intel 8085, prendendo un numero di 8 bit, in questo caso 5, posso scrivere questo:

mvi b,05
mov c,b
dcr b
l1: mov d,b
mvi a,00
l2: add c
dcr d
jnz l2
mov c,a
dcr b
jnz l1
hlt

il fattoriale di 5 sarebbe quindi 78 in esadecimale. la logica è .. 5! = 5x4x3x2x1

in modo da aggiungere 5 o quattro volte, il risultato (cioè 20) aggiungere tre volte e così via ... (5 + 5 + 5 + 5), (20 + 20 + 20), (60 + 60) e convertire 120 in esadecimale ...

Con questo programma, è possibile trovare fattoriale di un numero a 8 bit la cui risposta non supera il 24bit ! L'ingresso è data nel #2070 posizione di indirizzo e di uscita si ottiene è in 2 locazioni di memoria nell'ordine #2074 #2073 #2072

    LHLD 2070
    ANI 00
    MOV C,L
    MOV D,A
    MOV E,A
    XCHG
    DCR C
    JZ EXPT
    JM EXPT
    MOV B,C
L1: DAD D

    JNC BAK1
    INR A
BAK1:   DCR C

    JNZ L1
L3: DCR B

    JZ STOP
    MOV C,B
    XCHG
    LXI H,0000
L2: DAD D

    JNC BAK2
    INR A
BAK2:   DCR C

    JNZ L2
    JMP L3
EXPT:   MVI A,01

    STA 2072
    JMP END
STOP:   SHLD 2072

    STA 2074
END:    HLT
MVI B, 07h
LXI H, 0007h
LXI D, 0007h
DCR B

LOOP1:
    MOV C, B
    LXI H, 0

LOOP:
    DAD D
    DCR C
    JNZ LOOP

MOV E, L
MOV D, H
DCR B
JNZ LOOP1

HLT

Questo può aiutare. Questo è per 7 !.

Questo codice si trova il fattoriale di 9. È possibile trovare fattoriale di un numero qualsiasi fino a 9 cambiando il valore nel DB.

LHLD 2090
MOV C,L
MOV D,A
MOV E,A
XCHG
DCR C
MOV B,C
L1:DAD D
JNC B1
INR A
B1: DCR C
JNZ L1
L2 : DCR B
JZ END
MOV C,B
XCHG
LXI H,0000
JMP L1
END:SHLD 2092
STA 2094
HLT 
#ORG 2090H
#DB 09H
Org 0000h
Mov dptr,#8000h
Mov a,@dptr
Mov r0,a
Mov r1,#01h
Mov b,r1
L1:mul ab
Dec r0
Mov b,r0
Cjne r0,#00h,l1
Mov r2,a
H:sjmp h
End
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top