MIPS汇编语言之分支跳转指令和c语言转换示例

853 阅读2分钟

「这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战」。

分支跳转指令

  1. 整型数据分支比较跳转
  • bgt(branch if greater than):用于大于比较
bgt $t0,$t1,sub # 如果$t0中的数据大于$t1,则跳转到sub分支,执行sub中的代码,否则,按照顺序执行bgt下面的代码, sub是一个代号,可以自定义


sub:
  • beq(branch equal):用于等于比较
beq $t0,$t1,sub # 如果$t0中的数据等于$t1,则跳转到sub分支,执行sub中的代码,否则,按照顺序执行bgt下面的代码, sub是一个代号,可以自定义


sub:
  • ble(branch if less than):用于小于比较
ble $t0,$t1,sub # 如果$t0中的数据小于$t1,则跳转到sub分支,执行sub中的代码,否则,按照顺序执行bgt下面的代码, sub是一个代号,可以自定义


sub:

练习1: 将以下c代码转换成mips汇编代码:

scanf("%d",$a);
scanf("%d",$b);

if(a>b){
    printf("YES");
}else{
    printf("NO");
}

汇编代码:

# 用$t0指代a ,$t1指代b

.data
msg_yes: .ascii "YES\0" # \0表示字符串结尾
msg_no: .ascii "NO\0"


.text
li $v0,5  #控制syscall为读取integer状态
syscall # 此时io控制台显示光标,可输入数字,回车后将输入的数字保存在$v0中
move $t0,$v0 #由于接下来还需要使用$v0 ,为避免数据被覆盖掉 将输入的数据转移到$t0中进行临时保存

li $v0,5
syscall
move $t1,$v0 


bgt $t0,$t1,sub 
    li $v0,4
    la $a0,msg_no
    syscall
    
    #结束程序
    li $v0,10
    syscall
sub:
 	li $v0,4
    la $a0,msg_yes
    syscall

练习2: 将以下c代码转换成mips汇编代码:

//求累加之和
//1+2+3+.....+100
    
int i=1;
int s=0;
    
while(i<=100){
    s=s+i;
    i=i+1;
}
printf("%d",s);

汇编代码:

# 用$t0指代i ,$t1指代s

.text
li $t0 ,1
li $t1 ,0


loop:
# s=s+i;
add $t1,$t1,$t0
add $t0,$t0,1

ble $t0,100,loop


move $a0,$t1
li $v0,1
syscall
  1. 浮点型数据分支比较
  • 小于

    .data
    num1: .float 3.14
    num2: .float 3.16
    
    .text
    
    lwc1 $f0,num1
    lwc1 $f1,num2
    
    c.lt.s  $f0,$f1 #关键代码
    bc1t sub  #bc1t表示条件满足  bc1f表示不满足条件
    
    
    sub:
    
    
  • 等于

    .data
    num1: .float 3.14
    num2: .float 3.16
    
    .text
    
    lwc1 $f0,num1
    lwc1 $f1,num2
    
    c.eq.s  $f0,$f1 #关键代码 c表示coproc协处理寄存器 s表示single单精度
    bc1t sub  #bc1t表示条件满足  bc1f表示不满足条件
    
    
    sub:
    
    
  • 小于等于

    .data
    num1: .float 3.14
    num2: .float 3.16
    
    .text
    
    lwc1 $f0,num1
    lwc1 $f1,num2
    
    c.le.s  $f0,$f1 #关键代码
    bc1t sub  #bc1t表示条件满足  bc1f表示不满足条件
    
    
    sub:
    
    

    以上是单精度浮点数据的比较示例,如果是双精度,只需将结尾.s改成.d即可