PDA

View Full Version : [assembler8086] potenza tramite stack


umberto1211
25-05-2009, 18:46
Raga cerco esperto di assembler...ho bisogno di una mano per questo problema....

creare una sub che fa la potenza...che riceve come parametri la base e l'esponente ( dallo stack )e dà la risposta al programma principale mediante i registri

in pratica devo passare base ed esponente tramite lo Stack...ed è questo il punto che non so fare...x poi dare il risultato tramite registri...

!k-0t1c!
25-05-2009, 19:39
Direttamente in assembly:

push ecx
push BASE
push ESPONENTE
call potenza
add esp, 8
pop ecx

potenza:
mov ecx, [esp+8]
mov eax, [esp+0xC]
eleva:
imul eax, eax
dec ecx
jnz eleva
ret


Scritto al volo, ma ad occhio e croce dovrebbe funzionare per tutte le potenze a^b con a € Z, b € N, a > 0, b > 0 e a^b <= MAX_INT
Ovviamente lo puoi aggiustare come vuoi.
Se invece ti serve il calcolo con valori reali divertiti, perché dovrai usare un po' di fld e fmul :)
Nota: nel codice che chiama in questo caso BASE e ESPONENTE sono da rimpiazzare con apposite costanti. Inoltre la sintassi usata è quella intel (quindi mov dst, src / imul dst, src / ... e non AT&T)

umberto1211
25-05-2009, 19:40
ehm scusa forse ho sbagliato ad esprimermi in pratica devo usare lo stack senza push e pop..

!k-0t1c!
25-05-2009, 19:45
Poco male...

mov [esp-4], ecx
mov [esp-0xC], BASE
mov [esp-8], ESPONENTE
sub esp, 0xC
call potenza
add esp, 8
mov ecx, [esp]
sub esp, 4

potenza:
mov ecx, [esp+8]
mov eax, [esp+0xC]
eleva:
imul eax, eax
dec ecx
jnz eleva
ret


Il succo è che conoscendo il numero degli argomenti e il fatto che un push equivale per quel che t'importa come risultati a:

mov [esp-4], operand
sub esp, 4

puoi fare il mov degli argomenti in posizioni negative rispetto ad ESP e poi aggiustare ESP adeguatamente.

umberto1211
25-05-2009, 20:09
Poco male...

mov [esp-4], ecx
mov [esp-0xC], BASE
mov [esp-8], ESPONENTE
sub esp, 0xC
call potenza
add esp, 8
mov ecx, [esp]
sub esp, 4

potenza:
mov ecx, [esp+8]
mov eax, [esp+0xC]
eleva:
imul eax, eax
dec ecx
jnz eleva
ret


Il succo è che conoscendo il numero degli argomenti e il fatto che un push equivale per quel che t'importa come risultati a:

mov [esp-4], operand
sub esp, 4

puoi fare il mov degli argomenti in posizioni negative rispetto ad ESP e poi aggiustare ESP adeguatamente.

grazie mille per l interessamento....purtroppo noi a scuola non abbiamo ancora studiato
-esp
-ecx
ed il mov che comprende ad esempio 0xC come posso sostituire con qualcosa di piu semplice?
grazie ancora :D

!k-0t1c!
26-05-2009, 00:08
Non mi risulta che tu possa, perché se devi passare dati sullo stack devi scriverceli ed adeguare lo stack pointer. Se per la prima operazione sono possibili numerose soluzioni, lo stack pointer è modificato - per quanto ne so - solo da istruzioni call, ret, push, pop e operazioni aritmetiche effettuate direttamente su (E)SP. Quanto al mov, se avete studiato mov non importa se non avete studiato quella forma, dovrebbero lasciartelo usare. Alla fine, ad esempio
mov ebx, [esp+4]
non ha niente di diverso se non l'agilità e il consumo di risorse dal fare:

mov edx, esp
add esp, 4
mov ebx, [edx]

quindi come vedi è solo una forma più sintetica, pulita e performante per un'operazione comunque fattibile in maniera triviale.

umberto1211
26-05-2009, 05:55
Non mi risulta che tu possa, perché se devi passare dati sullo stack devi scriverceli ed adeguare lo stack pointer. Se per la prima operazione sono possibili numerose soluzioni, lo stack pointer è modificato - per quanto ne so - solo da istruzioni call, ret, push, pop e operazioni aritmetiche effettuate direttamente su (E)SP. Quanto al mov, se avete studiato mov non importa se non avete studiato quella forma, dovrebbero lasciartelo usare. Alla fine, ad esempio
mov ebx, [esp+4]
non ha niente di diverso se non l'agilità e il consumo di risorse dal fare:

mov edx, esp
add esp, 4
mov ebx, [edx]

quindi come vedi è solo una forma più sintetica, pulita e performante per un'operazione comunque fattibile in maniera triviale.

bhè si ovviamente hai ragione ma purtroppo se presento il codice cosi il prof gradirà si...ma con sospetto...:D

in maniera traviale ?cosa intendi..forse è quello che fa al caso mio..

cionci
26-05-2009, 08:43
!k-0t1c!: la prossima volta dai indicazioni, ma non risolvere completamente l'esercizio ;)

umberto1211: probabilmente tu hai fatto l'assembly a 16 bit per 8086 e non quello a 32 bit della soluzione proposta.

!k-0t1c!
26-05-2009, 09:03
Ok cionci, scusa, temo di esser stato preso da un eccesso di zelo, ma mi asterrò dal fornire ulteriori indicazioni in questo post onde lasciar qualcosa allo spirito d'iniziativa di umberto1211

rеpne scasb
26-05-2009, 11:15