2.6逻辑操作
移位:将一个字里面的所有位都向左或向右移动,并在空出来的位上填充0.
EXAMPLE:
0000 0000 0000 0000 0000 0000 0000 1001=9
左移四位:
0000 0000 0000 0000 0000 0000 1001 0000=144
移位有逻辑左移和逻辑右移,一般左移用的比较多
因为左移i位相当于乘以2^i,就像10左移移位变成100相当于10乘以10^1,
左移的助记符位sll,右移的助记符为srl
按位与(and):该操作仅当两个操作数均为1时结果才为1,否则为0
EXAMPLE:
$t2的值为:
0000 0000 0000 0000 0000 1101 1100 0000
$t3的值为:
0000 0000 0000 0000 0011 1100 0000 0000
在执行 and $t0,$t2,$t3后
$t0的值为:
0000 0000 0000 0000 0000 1100 1100 0000
AND提供了一种将源操作数中某些位置变为0的能力,前提是另一个操作数中对应位为0.后一个操作数传统上被称为掩码,寓意其可“隐藏”某些位。
按位或:该操作在两个操作位中任意一位为1时结果就为1
EXAMPLE:
依然使用上面$t2,$t3的值,那么
or $t0,$t2,$t3
执行后$t0的值为:
0000 0000 0000 0000 0011 1101 1100 0000
按位取反:该操作仅有一个操作数,将1变成0,0变成1。
为了保持三操作数的格式,MIPS的设计者引入或非(not or)指令来取代not。如果一个操作数是0,那么对另一个操作数而言,结果就等价于not:A NOR 0=NOT
MIPS指令也包括异或(XOR),当2个操作数对应位不同时置1,相同时置0。
2.7决策指令
决策指令如同高级语言中的if指令,就是具有选择功能,选择接下来执行哪条指令
第一条:
beq register 1,register2,L1
该指令表示:如果register1和register2中的数值相等,则转到标签为L1的语句执行。助记符beq(branch if equal)代表如果相等则分支。
解释一下转到某个标签执行的原理:程序是放在内存中的,没执行一条,CPU会从内存中提取一条,提取的法则就是按照内存地址,如果没有跳转的话,应该是一条一条向下执行。以上面这个例子说,L1就代表着一个内存地址,beq的功能就是直接让CPU提取L1所代表的内存地址中的指令。
第二条:
bne register 1,register2,L1
这条指令表示如果不相等则分支(branch if not equal).
EXAMPLE:
f,g,h,i,j依次分配给$s0,$s1,$s2,$s3,$s4
C: if (i==j) f=g+h; else f=g-h;
MIPS:
bne $s3,$s4,Else
add $s0,$s1,$s2
j Exit(j也是一种分支指令,叫做无条件分支指令。当遇到这种指令时,必须分支。)
Else:sub $s0,$s1,$s2
Exit:
2.7.1循环
学习决策指令后,高级语言中的循环指令也可以用汇编语言表示了
EXAMPLE:
C: while (save[i]==k)
i+=1;
假设i和k存放在寄存器$s3和$s5中,数组save的基址存放在寄存器$s6中。
MIPS:
Loop: sll $t1,$s3,2(i*4)
add $t1,$t1,$s6(基址和偏移地址相加,得到save[i]的地址)
lw $t0,0($t1)(将save[i]暂时存储到一个寄存器中)
bne $t0,$s5,Exit(执行循环判断,save[i]不等于K的话退出循环)
addi $s3,$s3,1(i=i+1;)
j Loop(跳转到循环的开始)
Exit