Mips 代码跳过If语句

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

这是一个从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*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); }