【汇编语言】直接定址表
文章目录
- 【汇编语言】直接定址表
- 前言
- 一、移位指令
- 移位指令过程
- 逻辑移位指令shl 和 shr
- 二、操作显存数据
- 显示的原理
- 显示缓冲区的结构
- 显示信息的一种“直接”方式
- 三、描述内存单元的标号
- 关于标号
- 去了冒号的数据标号
- 数据标号同时描述内存地址和单元长度
- 更常见的方式:数据段中的数据标号
- 四、数据的直接定址表
- 直接定址表:用查表的方法解决问题
- 最简解决方案
- 直接定址表
- 应用示例:为加快运算速度而采用查表方法
- 五、代码的直接定址表
- 使用代码的直接定址表解决问题
- 各种功能的实现
- 直接定址表的优势
- 总结
前言
在本篇文章中我们将讲到,移位指令,操作显存数据,操作内存单元的称号,数据的直接定址表,代码的直接定址表。
一、移位指令
移位指令过程
逻辑移位指令shl 和 shr
SHL OPR, CNT,将OPR逻辑左移CNT位
1)将寄存器或内存单元中的数据向左移位
2)将最后移出的一位写入CF中
3)最低位用0补充
shl指令操作示例
注意:移位一位的时候可以用立即数1,大于一位必须用cl来储存所需移位。
惯常用法:将X逻辑左移一位,相当于执行X=X*2;右移一位,相当于执行X=X/2
二、操作显存数据
显示的原理
【汇编语言】初始汇编-中的内存地址空间
我们在之前的文章中有谈到
屏慕上的内容=显存中的数据
显示缓冲区的结构
例:
显示信息的一种“直接”方式
显示信息的一种“直接”方式:直接在显示缓冲区输入要显示的数据
例:编程序,在屏幕的中间,白底蓝字,显示‘Welcome to masm!’
三、描述内存单元的标号
关于标号
代码段中的标号可以用来标记指令、段的起始地址。
代码段中的数据也可以用标号
我们在想:offset .cs:…能简单点吗?我们引入去了冒号的数据标号。
去了冒号的数据标号
我们在code 段中使用的标号a、b后面没有“:” ,它们同时描述内存地址和单元长度的标号。
标号a
地址code:0
以后的内存单元都是字节
标号b
地址code:8
以后的内存单元都是字
数据标号同时描述内存地址和单元长度
更常见的方式:数据段中的数据标号
对比:地址标号只能在代码段中使用
数据段中的数据标号
扩展用法:将标号当作数据来定义
四、数据的直接定址表
直接定址表:用查表的方法解决问题
问题:以十六进制的形式在屏幕中间显示给定的byte 型数据。
分析:先将一个byte的高4位和低4 位分开,显示对应的数码字符
方案一:
这种方法显然不好。
方案二:
能不能一次解决这种问题不用分成两种呢?
方案三:
这种方法相对来说最简单。
最简解决方案
最简方案:建立一张表,表中依次存储字符’0’~ ‘F’,通过数值0~15直接查找到对应的字符。
直接定址表
问题求解思路:
利用表,在两个数据集合之间建立一种映射关系,用查表的方法根据给出的数据得到其在另一集合中的对应数据。
优点:
算法清晰和简洁
加快运算速度,以空间换时间
使程序易于扩充
例如:
三角函数表我们需要的值可以通过映射方法找到
应用示例:为加快运算速度而采用查表方法
问题:
编写程序,计算sin(x),x∈{0°,30°,60°,90°,120°,150°,180°},并在屏幕中间显示计算结果。
方法一:
这种方法显然不好。
方法二:
解决方案:
五、代码的直接定址表
使用代码的直接定址表解决问题
直接定址表法:
用查表的方式,通过依据数据,直接计算出所要找的元素的位置
直接定址表分类:
1)数据的直接定址表
2)代码的直接定址表
要解决的问题
实现一个子程序setscreen ,为显示输出提供如下功能
1)清屏。
2)设置前景色。
3)设置背景色。
4)向上滚动一行
各种功能的实现
直接定址表的优势
要在 setscreen 中再加入新功能,只需要在地址表中加入它的入口地址就可以了。结构清晰,便于扩充。
不用 直接定址表
要在 setscreen 中再加入新功能,则需要修改程序的逻辑,加入新的比较、转移指令,比较麻烦。
总结
到这里这篇文章的内容就结束了,谢谢大家的观看,如果有好的建议可以留言喔,谢谢大家啦!