《计算机组成与设计》part3

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

 

 

 

你可能感兴趣的:(《计算机组成与设计》part3)