【问题标题】:MIPs Store Integers arrayMIP 存储整数数组
【发布时间】:2015-09-23 16:03:22
【问题描述】:
.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.

大家好。这段代码基本上做了 3 件事:

  • 生成 2 个随机整数
  • 计算 MCD
  • 质数概率

用户决定的迭代次数。

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

.数据

数组:.space 32

.文本

sw $s6, 数组, ($k1)
添加 $k1, $zero, 4)

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

谢谢

【问题讨论】:

    标签: arrays random mips greatest-common-divisor


    【解决方案1】:

    您会遇到对齐异常,因为在 MIPS 中对内存的访问必须是字对齐的,即地址必须是 4 的倍数对于 32 位字,而地址必须是 2 的倍数对于 16 位字。

    要对齐缓冲区,您应该通过发出.align X 指令来指示汇编器这样做,其中 X 为 2 以对齐字边界,1 以对齐半字边界。

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

    .align 2
    

    之前

    array: .space 32
    

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

    【讨论】:

    • 谢谢你,古斯布罗。 align 指令似乎有效。关于第二个答案就是这样,正如我所说的迭代由用户决定,可以是 5 或 20 或 100 或 100000。我相信没有限制......
    • 嗯,总有一个限制,可能是您的整数范围或您拥有的内存。您可以将数组设置为 .data 段的最后一个位置,即在您的 array 标签之后没有定义其他变量。然后您可以将所有剩余内存视为您的数组空间(直到它“命中”您的代码段)
    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    相关资源
    最近更新 更多