2015-09-23 43 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. 

嗨,給大家。此代碼基本上沒有三樣東西:MIPs Store Integers陣列

  • 生成2個隨機量詮釋
  • 計算MCD
  • 的黃金

由用戶自主決定迭代次數習題。

所以,這裏是我的問題:我存儲了2個數字和MCD在$ s5,$ s6,$ s7中,我想用數組打印它。首先,如果我嘗試把1號到一個數組,我得到這個錯誤(存儲的字邊界上未對齊):

。數據

陣列:32。空間

的.text

SW $ S6,數組($ K1)
阿迪$ K1,$零,4)

而我的另一個問題是:如何定義。空間數組因爲用戶決定迭代次數?

感謝

回答

0

你得到排列異常,因爲在MIPS訪問內存必須字對齊的單詞,即地址必須是4對32位字的整數倍,併爲16位字的2倍數。

要對齊緩衝區,您應該通過發出.align X指令來指示彙編程序執行此操作,其中X爲2以在字邊界對齊,而1以半字邊界對齊。

所以在你的榜樣,你應該把

.align 2 

array: .space 32 

關於你的第二個問題,我會根據你的程序的最大允許迭代預留空間。或者,您可以將該緩衝區從其後沒有其他變量/緩衝區的地址開始。

+0

謝謝,Gusbro。 align指令似乎工作。關於第二個答案是這樣的,正如我所說的迭代是由用戶決定的,可能是5或20或100或100000.沒有限制我相信... – JEC

+0

那麼,總是有一個限制,可能是你的範圍整數或你擁有的記憶。你可以將你的數組設置爲'.data'段的最後一個位置,也就是說,在'array'標籤之後沒有定義其他變量。然後你可以將所有剩餘的內存視爲你的數組空間(直到它「擊中」你的代碼段) – gusbro