Arrays 求数组上的随机数

Arrays 求数组上的随机数,arrays,assembly,mips,Arrays,Assembly,Mips,我必须创建一个mips代码,它必须告诉我数组(1)中是否有随机数(由用户给定)(0)。我有两个问题,第一个问题是,我试图问用户的随机数(li$v0,5——syscall——move$t0,$v0)不起作用,事实上,当我组装它时,它什么都不起作用。 第二个问题很奇怪,我有两个循环(目标循环)和(退出循环),第一个用于检查数组位置(10个位置)上是否有数字,第二个用于在没有找到数字的情况下以0退出。 有什么想法吗 iterator = 4 N = 10 .data vector:

我必须创建一个mips代码,它必须告诉我数组(1)中是否有随机数(由用户给定)(0)。我有两个问题,第一个问题是,我试图问用户的随机数(li$v0,5——syscall——move$t0,$v0)不起作用,事实上,当我组装它时,它什么都不起作用。 第二个问题很奇怪,我有两个循环(目标循环)和(退出循环),第一个用于检查数组位置(10个位置)上是否有数字,第二个用于在没有找到数字的情况下以0退出。 有什么想法吗

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
您的程序似乎没有问题

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

我做了一些轻微的表面清理,并添加了一些注释。我还简化了print integer系统调用[您的系统调用本来可以正常工作]

我确实在一个新标签
exit\u program
上添加了一个额外的跳转,以将通过/失败案例分开。否则,从通过案例到失败案例都会出现“失败”,通过案例的结果是“10”而不是“1”

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

我测试了这个程序,它在
QtSpim
mars
上都能工作

无论如何,可以肯定的是,这里有一个有效的版本:

    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
您的程序似乎没有问题

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

我做了一些轻微的表面清理,并添加了一些注释。我还简化了print integer系统调用[您的系统调用本来可以正常工作]

我确实在一个新标签
exit\u program
上添加了一个额外的跳转,以将通过/失败案例分开。否则,从通过案例到失败案例都会出现“失败”,通过案例的结果是“10”而不是“1”

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

我测试了这个程序,它在
QtSpim
mars
上都能工作

无论如何,可以肯定的是,这里有一个有效的版本:

    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

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