.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.
大家好。这段代码基本上做了三件事:
用户决定的迭代次数。
所以,这是我的问题:我将2个数字和MCD存储在$ s5,$ s6,$ s7中,我希望将其打印为使用数组的表格。首先,如果我尝试将1号放入数组,我得到一个错误(存储的单词未在边界上对齐):
。数据
数组:.space 32
的.text
sw $ s6,数组,($ k1)
addi $ k1,$ zero,4)
我的另一个问题是:我如何定义.space for array,因为用户决定了迭代次数?
由于
答案 0 :(得分:0)
您正在获得对齐异常,因为在MIPS中,对于字的访问必须是字对齐的,即对于32位字,地址必须是4的倍数,对于16位字,地址必须是2的倍数。
要对齐缓冲区,您应该通过发出.align X
指令来指示汇编程序执行此操作,其中X为2以对齐字边界,1为对齐半字边界。
所以在你的例子中你应该放
.align 2
之前
array: .space 32
关于第二个问题,我会根据程序允许的最大迭代次数来保留空间。或者,您可以将缓冲区从其后没有其他变量/缓冲区的地址开始。