2015-09-23 2 views
1
.data 
spacestr: .asciiz " " 
pow: 
.asciiz "Ingrese numero de Iteraciones = " 
mcd: 
.asciiz "MCD " 
linea: 
.asciiz "\n" 
proba: 
.asciiz "la probabilidad es: \n%" 

.text 
main: 

li $v0,4    
la $a0,pow 
syscall    #imprime mensaje en pow 

li $v0,5 
syscall    #Lee el entero ingresado por el usuario. 
move $t5,$v0   #mueve el valor leído a t5 

li $t6, 1 
li $t8, 1 
li $t9, 0 
li $k0, 100 

mainloop: 
bgt $t6,$t5,Fin 

li $v0, 30 
syscall 

move $t0, $a0 

li $a0, 1 
move $a1, $t0 
li $v0, 40 
syscall 

li $a0, 1 
li $a1, 1000 
li $v0, 42 
syscall    #Genera numero aleatorio (time feed) 
move $a2, $a0   # Guarda el numero en a2 

li $v0, 1 
syscall    # imprime el entero. 

move $s5, $a2   #guardo en s5 el primero numero generado (pregunta!) 

li $v0, 4 
la $a0,spacesrt 
syscall    #imprime un espacio 

li $a0, 1 
li $a1, 1000 
li $v0, 42 
syscall    #genera segundo numero aleatorio. 
move $a3, $a0   #mueve el numero generado a a3 

li $v0, 1 
syscall    #imprime el segundo entero generado. 
move $s6, $a3   #guardo el valor en s6 (pregunta!) 

# Euclides MCD (GCD) 

slt $s0, $a2, $a3  #compara si a < b. Verdadero s0=1 sino s0=0 
bne $s0,$zero, SwapNumbers 

SwapNumbers: 
move $t2, $a2 
move $a2, $a3 
move $a3, $t2 
loop: 
beq $a3,$zero,EXIT 

move $t4,$a3    # c = b 
rem $a3,$a2,$a3   # b = a % b 
move $$a2,$t4    # a = c 
j loop 
EXIT: 

move $s7, $a2    #El valor del MCD 
li $v0, 4 
la $a0,spacestr 
syscall 

li $v0,4 
la $a0,mcd 
syscall 

li $v0,4 
la $a0,mcd     #imprime la palabra en mcd 
syscall 

li $v0,1 
la $a0,($s7)     #luego muestra el valor calculado de MCD 
syscall 

li $v0,4 
la $a0,linea 
syscall      # Cambio de linea (por orden en iteraciones) 

addi $t6,$t6,1 

bne $s7,st8, exit   #cuenta las veces que MCD = 1 (primos) 
addi $t9,$t9,1 
exit: 
j mainloop 

Fin: 

mtc1 $st9, $f1 
cvt.s.w $f1,$f1 
mtc1 $t5, $f2 
cvt.s.w $f2,$f2 
mtc1 $k0,$f3 
cvt.s.w $f3,$f3 

div.s $f12,$f1,$f2 
mul.s $f12,$f12,$f3  # (primos/iteraciones*100) 

li $v0, 4 
la $a0, proba 
syscall 

li $v0, 2 
syscall     # Imprime resultado en f12 

li $v0,10 
syscall     #Finaliza programa. 

Salut à tous. Ce code fait essentiellement 3 choses:MIPs Store Entiers tableau

  • 2 générons randoms int
  • calculate
  • base de données centrale Prob de premier

Le nombre d'itérations décidées par l'utilisateur. Donc, voici mon problème: J'ai stocké les 2 numéros et le MCD dans $ s5, $ s6, $ s7 et je veux imprimer cela comme une table en utilisant des tableaux. Tout d'abord, si je tente de mettre le 1 numéro dans un tableau, je suis arrivé ce une erreur (mot stocké non alignée sur la limite):

.data

tableau

: .space 32

.text

sw s6 $, tableau, (k1 $)
Addi k1 $, zéro $, 4)

Et mon autre problème est: Comment définir .space pour le tableau puisque l'utilisateur de décider le nombre d'itérations ?

Merci

Répondre

0

Vous obtenez des exceptions d'alignement, car l'accès MIPS à la mémoire doivent être mots alignés pour les mots, à savoir l'adresse doit être un multiple de 4 mots de 32 bits, et des multiples de 2 pour les mots de 16 bits. Pour aligner un tampon, vous devez indiquer à l'assembleur de le faire en émettant une directive .align X, où X est 2 pour aligner les limites de mots et 1 pour s'aligner sur les limites de demi-mot.

Donc, dans votre exemple, vous devriez mettre

.align 2 

avant

array: .space 32 

A propos de votre deuxième question, je réserverais l'espace selon les itérations maximales autorisées de votre programme. Vous pouvez également placer ce tampon à partir d'une adresse où il n'y a pas d'autres variables/tampons après.

+0

Merci, Gusbro. La directive align semble fonctionner. A propos de la deuxième réponse c'est la chose, comme je disais que les itérations sont décidées par l'utilisateur, pourrait être 5 ou 20 ou 100 ou 100000. Aucune limite je crois ... – JEC

+0

Eh bien, il y a toujours une limite, que ce soit la portée de entiers ou la mémoire que vous avez. Vous pouvez définir un tableau comme le dernier emplacement de votre segment '.data', c'est-à-dire qu'aucune autre variable n'est définie après votre étiquette' array'. Ensuite, vous pouvez considérer toute la mémoire restante comme votre espace de tableau (jusqu'à ce qu'il "frappe" votre segment de code) – gusbro