【汇编语言与计算机系统结构笔记14】循环和分支程序设计
本次笔记内容:
18.循环程序设计-1
19.分支程序设计
注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库。因此,为了节省时间,我只记录老师上课强调的内容与对应ppt页码。
本节课对应幻灯片:汇编语言程序设计-循环与分支,第1页起。
今天进入了第 5 章。
文章目录
P3 编写汇编语言程序的步骤
- (1) 分析题意,确定算法
- (2) 根据算法画出
程序框图
- (3) 根据框图编写程序
- (4) 上机调试程序
P4 程序结构
其实循环结构,也是分支结构的特例。
P5 循环程序设计
现在已经有了些高级指令,能方便地实现循环。我们今天讲基础指令实现的循环。
初始化:设置循环的初始状态
循环体:循环的工作部分及修改部分
控制条件:
- 计数控制
- 特征值控制
- 地址边界控制
P7-8 把BX中的二进制数以十六进制的形式显示在屏幕上
BX中就是二进制数。
如上,需要移位指令,每次移位4位。
如上,使用 ch
控制循环。
P9 例:从键盘接收十进制数并存入BX
如上,之所以对 al
减 30h ,是为了把 ASC 码中的字符转换为数字。
其中,交换指令是否是必须的?
-
bx
存储当前的值; -
ax
用于做乘法,因此要进行第一条交换; - 而下面的
xchg
可以没有。
P10 例:从键盘接收十六进制数并存入BX
如果接收16,使用乘以16来实现,但是乘16本身有特殊性,左移四位就可以。
上面的程序只能接收小写的a
到f
,其实并不合理,需要调整。
P11 例:将正数 n 插入一个已整序的正数字数组
这个问题有些先决条件:我们的数组已经排好序了,且都是正数。
从后往前比。
ax
是为了与内存中的数做比较。
注意 compare 子程序中,最后是 jmp short ...
,因为我们知道这个程序没有多长,没有必要分配 16 位的空间。因此这样省一些空间。
P12 例:将首地址为 a 的字数组从大到小排序
起泡排序算法,多重循环。
你会发现,高级语言比汇编语言在这个的实现上更长,而二者思路差不多。
要注意计数器的保存与恢复。
P14 分支程序设计
- (1) 逻辑尺控制
- (2) 条件控制
- (3) 地址跳跃表(值与地址有对应关系的表)
P15-16 逻辑尺控制举例
如图,设置一个字长的逻辑尺。
逻辑尺放到dx
中了。
P17- 例:折半查找算法
折半查找必须是排好序的。
di
的值没变过,用于表示取数的个数。
此外,还有另外一种算法,算法的前面的部分其实都是一样的。
在算法2中,之所这么做,是字
数组。
如果能改成字节
数组,也能运算,才是真正明白了该算法。
P23- 地址跳跃表举例
例:根据 AL 寄存器中哪一位为 1(从低位到高位),把程序转移到 8 个不同的程序分支。
寄存器间接寻址
使用了无条件转移指令。因为不知道找一个字还是两个字,所以用了jmp word ...
。
寄存器相对寻址
相对寻址与间接寻址差别不大。
基址变址寻址
注意其中使用了逻辑左移,从右往左来判断的。