un programma in linguaggio assembly 8085 per trovare il fattoriale di un numero
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
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