【汇编语言与计算机系统结构笔记14】循环和分支程序设计

本次笔记内容:
18.循环程序设计-1
19.分支程序设计

注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库。因此,为了节省时间,我只记录老师上课强调的内容与对应ppt页码。

本节课对应幻灯片:汇编语言程序设计-循环与分支,第1页起。

今天进入了第 5 章。

P3 编写汇编语言程序的步骤

  • (1) 分析题意,确定算法
  • (2) 根据算法画出程序框图
  • (3) 根据框图编写程序
  • (4) 上机调试程序

P4 程序结构

【汇编语言与计算机系统结构笔记14】循环和分支程序设计
其实循环结构,也是分支结构的特例。

P5 循环程序设计

【汇编语言与计算机系统结构笔记14】循环和分支程序设计
现在已经有了些高级指令,能方便地实现循环。我们今天讲基础指令实现的循环。

初始化:设置循环的初始状态

循环体:循环的工作部分及修改部分

控制条件:

  • 计数控制
  • 特征值控制
  • 地址边界控制

P7-8 把BX中的二进制数以十六进制的形式显示在屏幕上

BX中就是二进制数。

【汇编语言与计算机系统结构笔记14】循环和分支程序设计
如上,需要移位指令,每次移位4位。

【汇编语言与计算机系统结构笔记14】循环和分支程序设计
如上,使用 ch 控制循环。

P9 例:从键盘接收十进制数并存入BX

【汇编语言与计算机系统结构笔记14】循环和分支程序设计
如上,之所以对 al 减 30h ,是为了把 ASC 码中的字符转换为数字。

其中,交换指令是否是必须的?

  • bx 存储当前的值;
  • ax 用于做乘法,因此要进行第一条交换;
  • 而下面的 xchg 可以没有。

P10 例:从键盘接收十六进制数并存入BX

【汇编语言与计算机系统结构笔记14】循环和分支程序设计
如果接收16,使用乘以16来实现,但是乘16本身有特殊性,左移四位就可以。

上面的程序只能接收小写的af,其实并不合理,需要调整。

P11 例:将正数 n 插入一个已整序的正数字数组

这个问题有些先决条件:我们的数组已经排好序了,且都是正数。

【汇编语言与计算机系统结构笔记14】循环和分支程序设计

从后往前比。

ax 是为了与内存中的数做比较。

注意 compare 子程序中,最后是 jmp short ... ,因为我们知道这个程序没有多长,没有必要分配 16 位的空间。因此这样省一些空间。

P12 例:将首地址为 a 的字数组从大到小排序

起泡排序算法,多重循环。
【汇编语言与计算机系统结构笔记14】循环和分支程序设计
【汇编语言与计算机系统结构笔记14】循环和分支程序设计
你会发现,高级语言比汇编语言在这个的实现上更长,而二者思路差不多。

要注意计数器的保存与恢复。

P14 分支程序设计

【汇编语言与计算机系统结构笔记14】循环和分支程序设计

  • (1) 逻辑尺控制
  • (2) 条件控制
  • (3) 地址跳跃表(值与地址有对应关系的表)

P15-16 逻辑尺控制举例

【汇编语言与计算机系统结构笔记14】循环和分支程序设计
如图,设置一个字长的逻辑尺。

【汇编语言与计算机系统结构笔记14】循环和分支程序设计
逻辑尺放到dx中了。

P17- 例:折半查找算法

折半查找必须是排好序的。

【汇编语言与计算机系统结构笔记14】循环和分支程序设计
【汇编语言与计算机系统结构笔记14】循环和分支程序设计
【汇编语言与计算机系统结构笔记14】循环和分支程序设计
【汇编语言与计算机系统结构笔记14】循环和分支程序设计
di的值没变过,用于表示取数的个数。

此外,还有另外一种算法,算法的前面的部分其实都是一样的。
【汇编语言与计算机系统结构笔记14】循环和分支程序设计
【汇编语言与计算机系统结构笔记14】循环和分支程序设计
在算法2中,之所这么做,是数组。

如果能改成字节数组,也能运算,才是真正明白了该算法。

P23- 地址跳跃表举例

例:根据 AL 寄存器中哪一位为 1(从低位到高位),把程序转移到 8 个不同的程序分支。

【汇编语言与计算机系统结构笔记14】循环和分支程序设计

寄存器间接寻址

【汇编语言与计算机系统结构笔记14】循环和分支程序设计
使用了无条件转移指令。因为不知道找一个字还是两个字,所以用了jmp word ...

寄存器相对寻址

【汇编语言与计算机系统结构笔记14】循环和分支程序设计
相对寻址与间接寻址差别不大。

基址变址寻址

【汇编语言与计算机系统结构笔记14】循环和分支程序设计
注意其中使用了逻辑左移,从右往左来判断的。