【问题标题】:Finding random number on array在数组上查找随机数
【发布时间】:2016-05-17 21:11:33
【问题描述】:

我必须创建一个 mips 代码,它必须告诉我随机数(由用户提供)是否在数组 (1) 中或不在 (0) 中。我有两个问题,第一个是我试图向用户询问的随机数(li $v0, 5 -- syscall -- move $t0, $v0)它不起作用,实际上它什么也没做当我组装它时。 第二个问题很奇怪,我有 2 个循环(目标)和(退出循环),第一个检查数字是否在任何数组位置(10 个位置)上,第二个用 0 退出,如果没有t 找到号码。 有什么想法吗?

iterator = 4
N = 10
     .data
vector:         .word 2, 3, 5, 6, 8, 1, 3, 2, 5, 9
     .text
main:
    lw $t2, buscador
    li $t1, iterator
    la $s1, vector
    move $s0, $zero

    li $v0, 5
    syscall
    move $t0, $v0

target:
    bgt    $s0, N, exit_loop
    mul $t3, $s0, $t1
    addu $t3, $t3, $s1
    lw $t3, 0($t3)
    addi $s0, $s0, 1
    bne    $t0, $t3, target
    li $s2, 1
    move $a0, $s2
    li $v0, 1
    syscall

exit_loop:
    li $s2, 0
    move $a0, $s2
    li $v0, 1
    syscall

    li $v0, 10
    syscall

【问题讨论】:

  • 因此您需要通过系统调用从用户那里收集一个数字,将该数字与向量中的每个数字进行比较,如果找到则返回 true/1,否则返回 0/false。我在您的循环中看不到比较操作码。您需要与当前向量元素进行比较,或者至少需要一个减法并检查零标志。
  • 第一个循环“目标”进入第一个向量空间,我这样做:--mul $t3, $s0, $t1-- --addu $t3, $t3, $s1-- -lw $t3, 0($t3)-- ,进入第一个数字并将其保存到 $t3 中,乘以 0*4(bits) 然后加 1 到 $s0,所以它就像 0*4 然后 1*4 , 2*4 ... 第二个循环用于退出,如果向量有 10 个数字,则如果 N 大于 10,则退出到“退出循环”并打印 0。
  • @MichaelDorgan 显然,您熟悉 x86 和类似的拱门,但 MIPS 有所不同。除了slt 之外,它确实没有 具有cmp 等效指令。它也没有条件代码或“标志”寄存器。程序中的 bne 指令是自包含的,就像(例如 x86)cmp blah1,blah2 ; bne label 全部合二为一。而且,程序是正确的 [AFAICT]。请参阅下面的答案。

标签: arrays assembly mips


【解决方案1】:

您的程序似乎没有任何问题

符号buscador 没有定义,因此程序可能没有正确汇编。我注释掉了给定的行。这可能是唯一的问题。

我做了一些轻微的外观清理并添加了一些注释。我还简化了打印整数系统调用 [你的本来可以工作的]。

确实添加了一个额外的跳转到新标签exit_program 以保持通过/失败案例分开。否则,您会从通过案例“失败”到失败案例,并且您将获得“10”而不是“1”作为通过案例。

但是,否则,我确实(即没有需要)改变你的逻辑。

我测试了这个程序,它可以在QtSpimmars 上运行。

无论如何,为了确定,这里有一个工作版本:

    iterator = 4
    N = 10

    .data
vector:     .word       2, 3, 5, 6, 8, 1, 3, 2, 5, 9
    .text

main:
    # NOTE: this symbol was _not_ defined, so spim may have silently not
    # run the program
    ###lw       $t2,buscador
    li      $t1,iterator            # get sizeof(vector[0])
    la      $s1,vector              # get vector base address
    move    $s0,$zero               # set vector index to zero

    # prompt user for number
    li      $v0,5
    syscall
    move    $t0,$v0

target:
    bgt     $s0,N,exit_loop         # vector end? if yes, fly

    mul     $t3,$s0,$t1             # offset = index * iterator
    addu    $t3,$t3,$s1             # current addr = base + offset
    lw      $t3,0($t3)              # fetch word from vector

    addi    $s0,$s0,1               # increment the vector index
    bne     $t0,$t3,target          # does value match? if no, loop

    # value matches -- output a 1
    li      $a0,1
    li      $v0,1
    syscall
    j       exit_program

# we did _not_ find a match -- output a 0
exit_loop:
    li      $a0,0
    li      $v0,1
    syscall

exit_program:
    li      $v0,10
    syscall

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2018-08-01
    • 2018-08-13
    相关资源
    最近更新 更多