【发布时间】: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]。请参阅下面的答案。