View Full Version : [MIPS Assembly] Riconoscere i valori multipli di 3
TinoSala
29-03-2011, 17:17
Innanzitutto salve a tutti. Vi ringrazio perchè qui ho trovato spesso soluzioni ai miei problemi. Ma ora mi sono dovuto iscrivere perchè ho bisogno direttam del vostro aiuto :D
Premettendo che non chiedo la risoluzione completa di un esercizio, per chiarezza scrivo, per prima cosa, l'esercizio in questione:
Dato un vettore A con 100 interi, memorizzato a partire dalla locazione 1000, scrivere un programma Assembler Mips che costruisca un vettore B, memorizzato a partire dalla locazione 2000, contenente i valori di A multipli di 4 oppure di multipli di 3.
So come "creare" il vettore B ma non ne so scegliere gli elementi perchè non so come si fa in assembler a vedere se un elemento del vettore (e in generale un numero) è multiplo di un numero!! so come si fanno le operazioni base come add o sottr ma in che modo possono essermi utili per trovare i multipli?so anche come eseguire delle decisioni e dei cicli quindi mi servirebbe solo un aiutino per capire come faccio a riconoscere se un numero è multiplo di un altro numero.
Grazie
Un numero X è multiplo di un altro numero Y se il resto della divisione tra X e Y è pari a 0.
Quindi ti basta fare una divisione e leggere il resto ;).
TinoSala
30-03-2011, 08:07
e come si fa a leggere il resto?
a quello che dici c'ero arrivato, in pseudocodice C la soluzione sarebbe
if(n1%n2==0)
n1 è multiplo di n2
ma con quali operazioni posso fare il % in assembler MIPS?
Se non ricordo male basta fare una semplice divisione (comando div?) e leggere i valori dei registri high e low. In uno c'è il quoziente mentre nell'altro il resto.
Se non ricordo male basta fare una semplice divisione (comando div?) e leggere i valori dei registri high e low. In uno c'è il quoziente mentre nell'altro il resto.
in assembly x86 solitamente funzionerebbe così:
mov eax, dividendo
mov ecx, divisore
div ecx
dopo il div ecx, vedrai che eax contiene il quoziente e edx contiene il resto. Non conosco però l'asm MIPS, ma suppongo sia simile
TinoSala
30-03-2011, 10:08
ehm e se volessi usare un set molto ristretto di istruzioni?:rolleyes:
Set di istruzioni
- add, sub
- and, or
- slt,
- lw, sw
- beq, bne
- j, jr
- addi, subi, slti
è un esercizio didattico, per imparare a programmare con poche istruzioni base con cui si può fare (in teoria) qualsiasi operazione, ovviamo senza tener conto che ci sarebbero soluzioni mooolto migliori utilizzando altre istr.
come si può ottenere un % o sapere il resto di una divisione utilizzando questo set di istruzioni?! ora capite quale era la mia difficoltà :D scusate se non l'ho specificato prima.
Potresti usare il metodo delle sottrazioni successive.
In pseudo-codice:
# calcola la divisione tra a e b
div(a, b):
q = 0; # quoziente
r = a; # resto
while r >= b do
r -= b;
q += 1;
end
return (q, r);
Una nota: l'algoritmo sopra mi sembra essere corretto se entrambi i valori sono positivi, invece non sembra esserlo per valori negativi.
Ho trovato anche una soluzione carina operante sui bit, ma solo per i divisori multipli di 2:
http://en.wikipedia.org/wiki/Modulo_operation#Performance_issues
Potresti usare il metodo delle sottrazioni successive.
In pseudo-codice:
# calcola la divisione tra a e b
div(a, b):
q = 0; # quoziente
r = a; # resto
while r >= b do
r -= b;
q += 1;
end
return (q, r);
Esatto :D Che è poi il metodo che utilizzavano in antichità :D Volendo, ma sarebbe leggermente più complesso, basterebbe l'addizione per tutte le operazioni "basilari" :fagiano:
TinoSala
30-03-2011, 14:02
perfetto!!nella soluzione dell'esercizio veniva privilegiata quella operante sui bit ma non riuscivo a capire come si poteva fare!! grazie mille WarDuck!!anke se mi pare di capire che funzioni solo con potenze di 2 e quindi 3 non saprei come farlo ma in quel caso potrei utilizzare la tua proposta!!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.