|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2004
Città: Monselice (PD)
Messaggi: 4640
|
[assembly]contare gli 0 in un numero binario
devo fare un esercizio in assembly, solo che non ho la piu pallida idea di come, il testo dice: " data una word contare il numero di bit a "0""
credo si usi lo shift per spostare il binario, ma non saprei come ![]()
__________________
2500KCorsair H70Asrock EXTREME4 GEN38GB Corsair DDR3 1600MHz CL8Gainward GTX570 GLHSSD Samsung 830 64GBCorsair CX600Centaurion2G500206BW \_\_\_\_\_DrSpeed_/_/_/_/_/
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
devi usare una maschera e giocare con lo shift. scegli tu se shiftare la maschera o la word data.
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jun 2004
Città: Monselice (PD)
Messaggi: 4640
|
scusa l'ignoranza, ma cos'è una maschera?
__________________
2500KCorsair H70Asrock EXTREME4 GEN38GB Corsair DDR3 1600MHz CL8Gainward GTX570 GLHSSD Samsung 830 64GBCorsair CX600Centaurion2G500206BW \_\_\_\_\_DrSpeed_/_/_/_/_/
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Aug 2005
Messaggi: 2755
|
Una maschera è ad esempio un numero binario in cui hai un uno e il resto zero.
Puoi contare gli zeri facendo una and bit a bit con il tuo dato, di volta in volta spostando l'uno nella maschera. Se l'and ti restituisce 0 hai uno zero nella posizione indicata dalla maschera Un esempio: numero 10100 Maschera (Al primo passaggio) 100 101 and 100=100->al primo posto non c'è uno zero Shift sulla maschera 010 101 and 010=000->al secondo posto c'è uno zero, incremento il contatore Shift sulla maschera 001 101 and 001=001->al terzo posto non c'è uno zero
__________________
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Soluzione A: Utilizzi una "maschera", cioè un valore in cui c'è sempre solo un bit a '1' che sposti verso una direzione che scegli tu. Fai quindi una AND tra questa maschera e il tuo valore di input. Il risultato sarà un valore di 0 o diverso da 0. Quindi ti basta contare quante volte ottieni un valore di 0. Naturalmente si può anche fare lo shift sul tuo valore di input e tenere ferma la maschera. Soluzione B: A dire il vero una maschera non servirebbe nemmeno se si lavora in assembly. Già ... perché basta tenere presente che quando si fa uno shift, il bit che "esce" va a finire nel flag di "carry". Pertanto ti basta fare un ciclo, shiftare il tuo valore di input e controllare il flag di carry. Soluzione C: Ci sarebbe un'altra soluzione che sfrutta un trucchetto forse non molto noto. È possibile eliminare il primo bit '1' più a destra (in qualunque posizione sia) facendo X AND (X-1). Questo permetterebbe di contare i bit a '1' (ovviamente facendo un ciclo). Se a te serve contare i bit a '0' farai N-c dove N è il numero totale dei bit e c il conto dei bit a '1'. Tra l'altro questa è la soluzione più veloce se ci sono pochi bit a '1' nel valore.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Jun 2004
Città: Monselice (PD)
Messaggi: 4640
|
Quote:
grazie ad entrambi per le spiegazioni molto dettagliate ![]()
__________________
2500KCorsair H70Asrock EXTREME4 GEN38GB Corsair DDR3 1600MHz CL8Gainward GTX570 GLHSSD Samsung 830 64GBCorsair CX600Centaurion2G500206BW \_\_\_\_\_DrSpeed_/_/_/_/_/
|
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Nell'assembly x86 c'è il salto condizionato JC, basato appunto sul carry. A partire dai 386 (ormai superati da un pezzo ![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jun 2004
Città: Monselice (PD)
Messaggi: 4640
|
si, scusami stiamo parlando di x86
![]()
__________________
2500KCorsair H70Asrock EXTREME4 GEN38GB Corsair DDR3 1600MHz CL8Gainward GTX570 GLHSSD Samsung 830 64GBCorsair CX600Centaurion2G500206BW \_\_\_\_\_DrSpeed_/_/_/_/_/
|
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Codice:
mov ax,[value] mov cx,10h xor dx,dx loop_zbit: shr ax,1h cmc adc dl,dh loop loop_zbit |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:14.