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

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

    基于条件的传送指令

    最好的开始时间是以前,其次是现在。
  • 相关阅读:
    codeforces 616B Dinner with Emma
    codeforces 616A Comparing Two Long Integers
    codeforces 615C Running Track
    codeforces 612C Replace To Make Regular Bracket Sequence
    codeforces 612B HDD is Outdated Technology
    重写父类中的成员属性
    子类继承父类
    访问修饰符
    方法的参数
    实例化类
  • 原文地址:https://www.cnblogs.com/dragonsbug/p/13625660.html
Copyright © 2011-2022 走看看