深入理解计算机系统:算术与逻辑运算+流程控制+跳转指令

 重点是leaq指令。

leaq指令是应用于地址运算的指令,不会对地址储存的值产生引用。

与mov指令对比:leaq S D   &S->D  、mov S D  S->D  

假如s的值是x,x地址里存储的值为i,则leaq执行后D为x,mov执行后D为i。

逻辑右移和算术右移区别:逻辑右移补0,算术右移补符号位。

流程控制

1.条件码

条件码是个位的一个寄存器,只能为0或为1 。当有算术逻辑发生变化时,这些条件码寄存器中的值才会发生变化。

CF:进位标志寄存器。最近的操作是最高位产生了进位。它可以记录无符号操作的溢出,当溢出时会被设为1。

ZF:零标志寄存器,最近的操作得出的结果为0。当计算结果为0时将会被设为1。

SF:符号标志寄存器,最近的操作得到的结果为负数。当计算结果为负数时会被设为1。

OF:溢出标志寄存器,最近的操作导致一个补码溢出(正溢出或负溢出)。当计算结果导致了补码溢出时,会被设为1。

条件码的值大多数情况下是被动改变的,这个是因为条件码是1位的,而我们最小的传送数据是8位的,因此无法改变。

大多数算术逻辑指令都会改变条件码的值,比如加法减法。lea作为地址运算,不改变条件码!

还有两个指令,只设置条件码而不改变寄存器:

既然我们无法直接读取条件码,我们可以用什么方法来访问条件码呢?

(1)可以根据条件码寄存器的某个组合,将一个字节设置为0或1。

(2)可以直接条件跳转到程序的某个其它的部分。

(3)可以有条件的传送数据。

 

   还有set指令中的目的操作数,只能是前面我们所讲的8个单字节的寄存器或者是存储一个字节的存储器位置。

跳转指令

jump 指令有三种跳转方式:

  ①直接跳转:跳转目标是作为指令的一部分编码的,比如上面的直接给一个标号作为跳转目标

  ②间接跳转:跳转目标是从寄存器或者存储器位置中读出的,比如 jmp *%eax 表示用寄存器 %eax 中的值作为跳转目标;再比如 jmp *(%eax) 以 %eax 中的值作为读地址,从存储器中读取跳转目标。

  ③其他条件跳转:根据条件码的某个组合,或者跳转,或者继续执行代码序列中的下一条指令。

基于条件的传送指令

最好的开始时间是以前,其次是现在。
原文地址:https://www.cnblogs.com/dragonsbug/p/13625660.html