购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

程序的流程分为顺序执行、条件分支和循环三种。 顺序执行 是指按照地址内容的顺序执行指令。 条件分支 是指根据条件执行任意地址的指令。 循环 是指重复执行同一地址的指令。顺序执行的情况比较简单,每执行一个指令程序计数器的值就自动加 1。但若程序中存在条件分支和循环,机器语言的指令就可以将程序计数器的值设定为任意地址(不是 +1)。这样一来,程序便可以返回到上一个地址来重复执行同一个指令,或者跳转到任意地址。接下来,我们就以条件分支为例,来具体说明循环时程序计数器的数值设定机制也是一样的。

图 1-5 表示把内存中存储的数值(示例中是 123)的绝对值输出到显示器的程序的内存状态。程序运行的开始位置是 0100 地址。随着程序计数器数值的增加,当到达 0102 地址时,如果累加寄存器的值是正数,则执行跳转指令(jump 指令)跳转到 0104 地址。此时,由于累加寄存器的值是 123,为正数,因此 0103 地址的指令被跳过,程序的流程直接跳转到了 0104 地址。也就是说,“跳转到 0104 地址”这个指令间接执行了“将程序计数器设定成 0104 地址”这个操作。

{%}

图1-5 执行条件分支的程序示例(显示绝对值)

条件分支和循环中使用的 跳转指令 ,会参照当前执行的运算结果来判断是否跳转。表 1-1 所列出的寄存器中,我们提到了标志寄存器。无论当前累加寄存器的运算结果是负数、零还是正数, 标志寄存器 都会将其保存(也负责存放溢出 和奇偶校验 的结果 )。

CPU 在进行运算时,标志寄存器的数值会根据运算结果自动设定。条件分支在跳转指令前会进行比较运算。至于是否执行跳转指令,则由 CPU 在参考标志寄存器的数值后进行判断。运算结果的正、零、负三种状态由标志寄存器的三个位 表示。图 1-6 是 32 位 CPU(寄存器的长度是 32 位)的标志寄存器的示例。标志寄存器的第一个字节位、第二个字节位和第三个字节位的值为 1 时,表示运算结果分别为正数、零和负数。

{%}

图1-6 比较运算的结果存储在标志寄存器的三个位中

CPU 执行比较的机制很有意思,因此请大家务必牢记。例如,假设要比较累加寄存器中存储的 XXX 值和通用寄存器中存储的 YYY 值,执行比较的指令后,CPU 的运算装置就会在内部(暗中)进行 XXX-YYY 的减法运算。而无论减法运算的结果是正数、零还是负数,都会保存到标志寄存器中。结果为正表示 XXX 比 YYY 大,零表示 XXX 和 YYY 相等,负表示 XXX 比 YYY 小。程序中的比较指令,就是在 CPU 内部做减法运算。怎么样,是不是挺有意思的? pQhIxa7pvG8WGsCG/qorIyrjGIZZZxtt5Z/LjmDImhL0ySdohEtKQt8eHh8ZYWFj

点击中间区域
呼出菜单
上一章
目录
下一章
×

打开