Discussione:
ciclo for in assembly
(troppo vecchio per rispondere)
Elena Ferrari
2004-09-09 08:49:17 UTC
Permalink
ciao!
mi potete dire come si passa un ciclo for da C ad assembly?
Ad esempio:

t4 = (2 elevato alla 17)
for (i=0; i<n; i++)
{ t0 = t1 + t4;
t3 = t0 * i;

L'elevazione a potenza è supportata? " alla 17 come si rappresenta?
Brunix
2004-09-09 17:05:43 UTC
Permalink
Post by Elena Ferrari
ciao!
mi potete dire come si passa un ciclo for da C ad assembly?
t4 = (2 elevato alla 17)
for (i=0; i<n; i++)
{ t0 = t1 + t4;
t3 = t0 * i;
L'elevazione a potenza è supportata? " alla 17 come si rappresenta?
ciao
a parte che non capisco cosa hai fatto...
se i parte da zero... t3 sarà sempre zero.
così non ti calcoli 2 alla 17...
ecco il codice esatto:
----
pot = 1;
for (i=1; i<=17; i++)
pot *= 2;
----
in assembly poi si complica un po' il discorso...
---
mov ecx, 1
mov eax, 2
cmp ecx, 17
jz fine
mul eax, 2
inc eax
fine:
---
devi utilizzare il registro eax perchè è a 32 bit. E' ovvio che non puoi
calcolare potenze di 2 che superano i 32 bit (es. 2 alla 32)
comunque per l'assembly ascolta anche il parere degli altri, perchè potrei
aver sbagliato.
ciao

Brunix
TheLegs
2004-10-14 09:17:59 UTC
Permalink
Post by Brunix
così non ti calcoli 2 alla 17...
[snip]
Se non ricordo male basta anche uno SHL...
--
Infinite loops with DOS batch files.
Lesson 2a: Simple ricorsion.
%0
Lesson 2b: Ricorsion with CALL (harmful).
call %0

TheLegs :: eirhnh soy neyrw
Julo
2004-09-11 18:29:40 UTC
Permalink
MOV EBX, 0100000000000000000b
Post by Elena Ferrari
L'elevazione a potenza è supportata? " alla 17 come si rappresenta?
none
2004-09-12 16:53:04 UTC
Permalink
Post by Elena Ferrari
ciao!
mi potete dire come si passa un ciclo for da C ad assembly?
dunque, puoi usare una delle istruzioni della famiglia loop (loop, loopnz,
loopz) ponendo in ecx il numero di ripetizioni. Esempio (sintassi nasm)
mov ecx,10
.lo:
; istruzioni
; istruzioni
loop .lo

esegue il blocco di istruzioni per 10 volte. Ovviamente devi assolutamente
evitare di modificare il registro ecx.
In alternativa puoi costruire un ciclo for con le istruzioni di salto e
decremento. Supponendo che in ebp-4 ci sia il nostro contatore...

mov dword [ebp-4],6
; istruzioni
.pippo:
; istruzioni
dec dword [ebp-4]
jnz .pippo


Infine ci sono le istruzioni della famiglia rep (rep, repe, repne) che non
servono propriamente per costruire un ciclo for, ma per fare eseguire un
dato numero di volte 1istruzione particolare, tipo movsX, stosX, scasX,
cmpsX.
Post by Elena Ferrari
t4 = (2 elevato alla 17)
for (i=0; i<n; i++)
{ t0 = t1 + t4;
t3 = t0 * i;
non ho capito questo pezzo di codice, t1 cos'è?
Post by Elena Ferrari
L'elevazione a potenza è supportata? " alla 17 come si rappresenta?
Devi costruire una funzione che la calcoli, tipo:

mov ecx,17 ; 17 ripetizioni del ciclo
mov ebx,2 ; in ebx metto la base
mov eax,1 ; l'istruzione mul moltiplica edx:eax per l'operando
xor edx,edx ; devo quindi azzerare i 32 bit superiori di edx:eax
.ripeti:
mul ebx
loop .ripeti
; il risultato è in edx:eax, se il numero è rappresentabile con 32 bit
; sarà solo in eax

Ciao
--
none
Continua a leggere su narkive:
Loading...