Mips 代码跳过If语句
这是一个从Java语言转换而来的代码 我试图在Mips 代码跳过If语句,mips,Mips,这是一个从Java语言转换而来的代码 我试图在QtSpim上运行代码,但它跳过了if语句,即使条件应该进入if语句 .text 主要内容: lui$s0,0x1001#s0=&(A[0]) addi$s1、$s0、24#s1=&(B[0]) addi$s2、$s0、64#s2=&(C[0]) 加上$t1,$t1,$0#i=0 addi$t0,$0,1#t0=1 sw$t0,0($s2)#c[0]=1 循环: slti$t2、$t1、5 beq$t2,$0,退出 sll$t3,$t1,2#t3=i
QtSpim
上运行代码,但它跳过了if语句,即使条件应该进入if语句
.text
主要内容:
lui$s0,0x1001#s0=&(A[0])
addi$s1、$s0、24#s1=&(B[0])
addi$s2、$s0、64#s2=&(C[0])
加上$t1,$t1,$0#i=0
addi$t0,$0,1#t0=1
sw$t0,0($s2)#c[0]=1
循环:
slti$t2、$t1、5
beq$t2,$0,退出
sll$t3,$t1,2#t3=i*4
加上$t4、$t3、$s1#t4=&(B[i])
加上$t5、$t3、$s2#t5=&(C[i]
lw$s3,0($t4)#B[i]
lw$s4,0($t5)#C[i]
加上$t7、$t3、$s0#t7=&(A[i])
lw$s5,0($t7)#A[i]
slt$t6、$s3、$s4#B[i]
Java代码:
inta[]=newint[5];
int B[]=新int[5];
int C[]=新int[5];
C[0]=1;
对于(int i=0;i有一些BUG。我已经用“BUG:”注释了您的源代码,创建了一个经过清理和工作的版本,带有数组的打印输出,并创建了一个C程序[对于asm来说,[IMO]是一种更好的原型语言]
这是您的原始源代码,只是注释,没有bug修复[请原谅这种免费的样式清理]:
# mipsjava -- java conversion
#
# int A[] = new int[5];
# int B[] = new int[5];
# int C[] = new int[5];
#
# C[0] = 1;
# for (int i = 0; i <= 4; i++) {
# if (B[i] < C[i]) {
# A[i] = C[i] - 1;
# }
# else {
# A[i] = B[i] + 1;
# C[i] = B[i] + 3;
# B[i] = B[i] | C[i] - 1;
# }
# }
.text
.globl main
main:
# BUG: wrong way to do handle the array addresses
lui $s0,0x1001 # s0 = &(A[0]) BUG: hardwired address
addi $s1,$s0,24 # s1 = &(B[0])
addi $s2,$s0,64 # s2 = &(C[0])
add $t1,$t1,$0 # i = 0 (BUG: this does _not_ set a zero)
addi $t0,$0,1 # t0 = 1
sw $t0,0($s2) # c[0] = 1
loop:
slti $t2,$t1,5
beq $t2,$0,exit
sll $t3,$t1,2 # t3 = i*4
add $t4,$t3,$s1 # t4 = &(B[i])
add $t5,$t3,$s2 # t5 = &(C[i]
lw $s3,0($t4) # B[i]
lw $s4,0($t5) # C[i]
add $t7,$t3,$s0 # t7 = &(A[i])
lw $s5,0($t7) # A[i]
slt $t6,$s3,$s4 # B[i] < C[i]
beq $t6,$0,else
addi $s4,$s4,-1 # C[i] - 1
sw $s4,0($t7)
addi $t1,$t1,1
j loop
else:
addi $t0,$s3,1 # B[i] + 1
sw $t0,0($t7)
addi $t0,$s3,3 # B[i] + 3
sw $t0,0($t5)
# BUG: uses _old_ C value and _not_ the one just stored
or $t0,$s3,$s4 # B[i] OR C[i]
addi $t0,$t0,-1
sw $t0,0($t4)
addi $t1,$t1,1
j loop
exit:
syscall
.data
# BUG: the A array has _zero length -- this does _not_ match the java code
A:
B: .word -9,9,2,3,8
c: .word 1,8,1,2,3
#mipsjava--java转换
#
#int A[]=新int[5];
#int B[]=新int[5];
#int C[]=新int[5];
#
#C[0]=1;
#对于(int i=0;i有一些BUG。我已经用“BUG:”注释了您的源代码,创建了一个经过清理和工作的版本,带有数组的打印输出,并创建了一个C程序[对于asm来说,[IMO]是一种更好的原型语言]
这是您的原始源代码,只是注释,没有bug修复[请原谅这种免费的样式清理]:
# mipsjava -- java conversion
#
# int A[] = new int[5];
# int B[] = new int[5];
# int C[] = new int[5];
#
# C[0] = 1;
# for (int i = 0; i <= 4; i++) {
# if (B[i] < C[i]) {
# A[i] = C[i] - 1;
# }
# else {
# A[i] = B[i] + 1;
# C[i] = B[i] + 3;
# B[i] = B[i] | C[i] - 1;
# }
# }
.text
.globl main
main:
# BUG: wrong way to do handle the array addresses
lui $s0,0x1001 # s0 = &(A[0]) BUG: hardwired address
addi $s1,$s0,24 # s1 = &(B[0])
addi $s2,$s0,64 # s2 = &(C[0])
add $t1,$t1,$0 # i = 0 (BUG: this does _not_ set a zero)
addi $t0,$0,1 # t0 = 1
sw $t0,0($s2) # c[0] = 1
loop:
slti $t2,$t1,5
beq $t2,$0,exit
sll $t3,$t1,2 # t3 = i*4
add $t4,$t3,$s1 # t4 = &(B[i])
add $t5,$t3,$s2 # t5 = &(C[i]
lw $s3,0($t4) # B[i]
lw $s4,0($t5) # C[i]
add $t7,$t3,$s0 # t7 = &(A[i])
lw $s5,0($t7) # A[i]
slt $t6,$s3,$s4 # B[i] < C[i]
beq $t6,$0,else
addi $s4,$s4,-1 # C[i] - 1
sw $s4,0($t7)
addi $t1,$t1,1
j loop
else:
addi $t0,$s3,1 # B[i] + 1
sw $t0,0($t7)
addi $t0,$s3,3 # B[i] + 3
sw $t0,0($t5)
# BUG: uses _old_ C value and _not_ the one just stored
or $t0,$s3,$s4 # B[i] OR C[i]
addi $t0,$t0,-1
sw $t0,0($t4)
addi $t1,$t1,1
j loop
exit:
syscall
.data
# BUG: the A array has _zero length -- this does _not_ match the java code
A:
B: .word -9,9,2,3,8
c: .word 1,8,1,2,3
#mipsjava--java转换
#
#int A[]=新int[5];
#int B[]=新int[5];
#int C[]=新int[5];
#
#C[0]=1;
#对于(int i=0;i你说if语句被“跳过”是什么意思?你是如何得出这个结论的?另外,你在退出时似乎缺少了li$v0,10
。你验证过数据段从0x10010000开始吗?对于我来说,QtSpim将它放在0x10000000。slt$t6,$s3,$s4#B[i]li$v0,10
。你验证过数据段是从0x10010000开始的吗?对我来说,QtSpim把它放在0x10000000。slt$t6,$s3,$s4#B[i]#include <stdio.h>
int A[5];
int B[5] = {-9,9,2,3,8};
int C[5] = {1,8,1,2,3};
void
show(const char *sym,int *arr)
{
printf("%s:",sym);
for (int i = 0; i < 5; i++) {
printf(" %d",arr[i]);
}
printf("\n");
}
int
main(int argc,char **argv)
{
int lt;
C[0] = 1;
for (int i = 0; i < 5; i++) {
lt = (B[i] < C[i]);
printf("main: i=%d B=%d C=%d lt=%d\n",i,B[i],C[i],lt);
if (lt) {
A[i] = C[i] - 1;
}
else {
A[i] = B[i] + 1;
C[i] = B[i] + 3;
B[i] = (B[i] | C[i]) - 1;
}
}
show("A",A);
show("B",B);
show("C",C);
}