「这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战」。
分支跳转指令
- 整型数据分支比较跳转
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
- 浮点型数据分支比较
-
小于
.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即可