zoukankan      html  css  js  c++  java
  • 深入理解计算机系统:算术与逻辑运算+流程控制+跳转指令

     重点是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 中的值作为读地址,从存储器中读取跳转目标。

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

    基于条件的传送指令

    最好的开始时间是以前,其次是现在。
  • 相关阅读:
    小学教师资格考试——综合素质——材料分析
    小学教师资格考试——综合素质——教师基本能力
    牛客网暑假训练第一场——J Different Integers(莫队算法 & 树状数组)
    牛客网暑假训练第二场——A run(递推&前缀和)
    CSU
    ZOJ
    CSU
    CSU
    HDU
    Hrbust-2090 背包(最小不可构造数)
  • 原文地址:https://www.cnblogs.com/dragonsbug/p/13625660.html
Copyright © 2011-2022 走看看