MIPs存储整数数组

时间:2015-09-23 16:03:22

标签: arrays random mips greatest-common-divisor

.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个randoms int
  • 计算MCD
  • 素数问题

用户决定的迭代次数。

所以,这是我的问题:我将2个数字和MCD存储在$ s5,$ s6,$ s7中,我希望将其打印为使用数组的表格。首先,如果我尝试将1号放入数组,我得到一个错误(存储的单词未在边界上对齐):

。数据

数组:.space 32

的.text

sw $ s6,数组,($ k1)
addi $ k1,$ zero,4)

我的另一个问题是:我如何定义.space for array,因为用户决定了迭代次数?

由于

1 个答案:

答案 0 :(得分:0)

您正在获得对齐异常,因为在MIPS中,对于字的访问必须是字对齐的,即对于32位字,地址必须是4的倍数,对于16位字,地址必须是2的倍数。

要对齐缓冲区,您应该通过发出.align X指令来指示汇编程序执行此操作,其中X为2以对齐字边界,1为对齐半字边界。

所以在你的例子中你应该放

.align 2

之前

array: .space 32

关于第二个问题,我会根据程序允许的最大迭代次数来保留空间。或者,您可以将缓冲区从其后没有其他变量/缓冲区的地址开始。