汇编语言学习第5章

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机系统的内存是分段管理的,汇编语言源程序也分若干个段来构成。 8086CPU有四个段寄存器,在通常情况下,一个段的长度不能超过64K 64K。 64K 段的长度是指该段所占的字节数: 如果段是数据段,则其长度是其所有变量所占字节数的总和; 如果段是代码段,则其长度是其所有指令所占字节数的总和。 在定义段时,每个段都有一个段名。在取段名时,要取一个具有一定含义 的段名。
5.2.2结构化程序的概念 5.2.2结构化程序的概念
结构化程序设计由迪克斯特拉(E.W.dijkstra)在1969年提出,是以模块化 设计为中心,将待开发的软件系统划分为若干个相互独立的模块,这样使完 成每一个模块的工作变单纯而明确,为设计一些较大的软件打下了良好的基 础。 按照结构化程序设计的观点,任何算法功能都可以通过由程序模块组成的 三种基本程序结构的组合: 顺序结构、选择结构和循环结构来实现。 顺序结构、选择结构和循环结构 结构化程序设计的基本思想是采用“自顶向下,逐步求精”的程序设计方法 自顶向下,逐步求精 自顶向下 和“单入口单出口”的控制结构。 自顶向下、逐步求精的程序设计方法从问题本身开始,经过逐步细化,将 解决问题的步骤分解为由基本程序结构模块组成的结构化程序框图。
5.1.4段的基本属性 5.1.4段的基本属性
本节对段定义中另外的一些属性 “对齐类型”、“组合类型”和“类别”作以说 明,这些可选项可根据需要选择书写。 如果源程序中不指定某个属性,那么,汇编程序将使用该属性的缺省值。 程序中段名可以是唯一的,也可以与其他段同名。若同一模块中,如果两 个段同名,则认为后段是前段的后续,其实属于同一段。 同一模块的两个同名段,后者的可选项属性要不与前者相同,要么属性省 略而选用前者的段属性。 例5.4 1.对齐类型(ALIGN) 1.对齐类型(ALIGN) 对齐类型 对齐类型表示当前段对起始地址的要求,连接程序(LINK.EXE)按表5.1的 地址格式来定位段的起始地址。 在进行段定位时,会根据其定位类型进行定位的,所以,各段之间就有可 能出现一些空闲字节,即可能浪费几个字节单元。
第五章: 第五章:汇编语言程序 设计基础
5.1 源程序的基本结构 5.2 汇编语言程序设计的基本方法和步骤 5.3 顺序程序设计 5.4 分支程序设计 5.5 循环程序设计
5.1源程序的基本结构 5.1源程序的基本结构
汇编语言源程序的组成部分有:模块、段、子程序和宏等。
5.1.1段的定义 5.1.1段的定义
;256是堆栈的长度, ;256是堆栈的长度,可根据需要进行改变 是堆栈的长度
在源程序的代码段中,还要添加如下程序段,才能把段STACK1当作堆栈段 来使用。
ASSUME SS:STACK1 CLI MOV AX,STACK1 MOV SS,AX MOV SP,OFFSET TOP STI ;可在代码段的段指定语句中一起说明 ;禁止响应可屏蔽中断
2.组合类型(COMBINE) 2.组合类型(COMBINE) 组合类型 组合类型是告诉连接程序如何把不同模块中段名相同的段合并在一起。 具体的组合类型如下:
表示当前段在逻辑上独立于其它模块,并有其自己的基地址。NONE是缺省 的组合类型。
NONE
PUBLIC
表示当前段与其它模块中同段名的PUBLIC类型段组合成一个段。组合的先 后次序取决于LINK程序中目标模块排列的次序。在组合时,后续段的起始 地址要按其对齐类型进行定位,所以,同名段之间可能有间隔。
源自文库
5.3.1顺序程序设计举例 5.3.1顺序程序设计举例
例5.6:试编写一程序计算以下表达式的值。w=(v-(x*y+z-540)) 5.6:试编写一程序计算以下表达式的值。w= 。w (x* 540)) /x式中x、y、z、v均为有符号字数据。 /x式中x、y、z、v均为有符号字数据。 式中 例5.7:已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列 5.7:已知某班学生的英语成绩按学号( 开始) 在TAB表中,假定要查询的学生的学号放在变量NO中,请将查得的结果放在 TAB表中,假定要查询的学生的学号放在变量NO中 表中 NO 变量ENGLISH中。试编写程序。 变量ENGLISH中 试编写程序。 ENGLISH 例5.8:假设有二个字变量word1和word2,编写程序段实现交换其值的功能。 5.8:假设有二个字变量word1和word2,编写程序段实现交换其值的功能。 word1 例5.9:试编写一个程序,把压缩存放的BCD码,转换为其对应十进制数字 5.9:试编写一个程序,把压缩存放的BCD码 BCD 的ASCII码。 ASCII码
5.3顺序程序设计 5.3顺序程序设计
顺序程序设计是完全按照指令的书写顺序而执行每一条指令,它没有分支、 循环和转移。是指令中最简单,最常见的程序结构,它的特点是结构简单, 易于理解,但只适合于处理简单问题的场合。 实际应用中,完全采用顺序结构的程序并不多。 顺序结构程序流程图如下:
S1 S2 S3
段定义的一般格式如下: 段名 … … 段名 例5.1 例5.2 ENDS [对齐类型 对齐类型] [组合类型 [类别 组合类型] 类别] SEGMENT [对齐类型] [组合类型] [类别] ;段内的具体内容
5.1.2段寄存器的说明语句 5.1.2段寄存器的说明语句
在汇编语言源程序中可以定义多个段,每个段都要与一个段寄存器建立一 种对应关系。 建立这种对应关系的说明语句格式如下: ASSUME 段寄存器名:段名[, 段寄存器名:段名, ……]
其中:段寄存器是CS、DS、ES、SS,段名是在段定义语句说明时的段名。 其中:段寄存器是CS、DS、ES、SS,段名是在段定义语句说明时的段名。 CS
在一条ASSUME语句中可建立多组段寄存器与段之间的关系,每种对应关系 要用逗号分隔。 例如, 例如,ASSUME CS:CODE1, DS:DATA1
5.2.3流程图画法规定 5.2.3流程图画法规定
程序流程图是程序分析中最基本、最重要的分析技术,它是进行流程程序 分析过程中最基本的工具。是由特定的几何图形、指向线、文字说明来表 示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。 1.符号用法 1.符号用法
2.使用约定 2.使用约定 ①图的布局
;给堆栈段的栈顶寄存器SP赋初值 给堆栈段的栈顶寄存器SP赋初值 SP ;恢复响应可屏蔽中断
方法2: STACK1 SEGMENT STACK ;定义一个堆栈段,其段名为STACK1 DB 256 DUP(?) STACK1 ENDS
上述段定义说明了该段是堆栈段,系统会自动把段寄存器SS和栈顶寄存器SP与该堆 上述段定义说明了该段是堆栈段,系统会自动把段寄存器SS和栈顶寄存器SP与该堆 SS和栈顶寄存器SP 栈段之间建立相应的关系,并设置其初值,而不用在代码段对它们进行赋值。 栈段之间建立相应的关系,并设置其初值,而不用在代码段对它们进行赋值。
上述段定义说明了该段的起始地址是下一个字地址、组合类型为PUBLIC、 上述段定义说明了该段的起始地址是下一个字地址、组合类型为PUBLIC、段 PUBLIC 类别是"Data"。 类别是"Data"。 "Data"
4.段组(GROUP) 4.段组(GROUP) 段组 段组伪指令GROUP是用于把源程序模块中若干个段结合成一个组,并对该段 组定义一个段组名。 段组伪指令的格式如下: 段组名 GROUP 段名[, 段名, ……]
COMMON
表示当前段与其它模块中同名段重叠,也就是说,它们的起始地址相同。 最终段的长度是同名段的最大长度。由于段覆盖,所以,前一同名段中的 初始化数据被后续段的初始数据覆盖掉。 组合类型STACK表示当前段是堆栈栈,其组合情况与PUBLIC相同。
STACK AT 数值表达式 该数值表达式是当前段所指定的绝对起始地址的段地址。
其中:段名之间要用逗号间隔,段名也可以用表达式“SEG 变量”或“SEG 标号”。 其中:段名之间要用逗号间隔,段名也可以用表达式 SEG 变量 或 SEG 标号 。
例5.5
5.2 汇编语言程序设计的基本 方法和步骤
5.2.1汇编语言程序设计基本步骤 5.2.1汇编语言程序设计基本步骤
一般来说,编制一个汇编语言程序的步骤如下: ① 分析题意,确定算法或算法思想。 ② 根据算法画出流程图,简单的情况也可不画。 ③ 分配存储空间和工作单元,合理地使用寄存器。 ④ 根据流程图编写程序。 ⑤ 上机调试运行程序。 ⑥ 编写说明文件
上面的语句说明了:CS对应于代码段CODE1,DS对应于数据段DATA1。 上面的语句说明了:CS对应于代码段CODE1,DS对应于数据段DATA1。 对应于代码段CODE1 对应于数据段DATA1
在ASSUME语句中,还可以用关键字NOTHING来说明某个段寄存器不与任何段 相对应。下面语句说明了段寄存器ES不与某段相对应。 ASSUME ES:NOTHING 在通常情况下,代码段的第一条语句就是用ASSUME语句来说明段寄存器与 段之间的对应关系。在代码段的其它位置,还可以用另一个ASSUME语句来改 变前面ASSUME语句所说明的对应关系。这样,代码段中的指令就用最近的 ASSUME语句所建立的对应关系来确定指令中的有关信息。 例5.3
3.类别(CLASS) 3.类别(CLASS) 类别 类别是一个由程序员指定的用单引号括起来的字符串。 如果一个段没有给出类别,那么,这个段的类别就为空。 类别是用于段的分类,连接程序利用该类别来调整同名、同类别的段,并 使它们相邻。 典型的类别是"Data"和"Code"。如果指定某段的类别是"Code",那么,该 "Data"和"Code" "Data" 段最好是代码段,这样,有的调试程序(如:CodeView)就可以顺序工作。 例如: DATA1 例如: SEGMENT WORD PUBLIC "Data" … DATA1 ENDS
流程图中所用的符号应该均心地分布,连线保持合理的长度,并尽量少使用长线。 ②符号的形状 流程图中多数符号内的空白供标注说明性文字。使用各种符号应注意符号的外形和各 符号大小的统一,避免使符号变形或各符号大小比例不一。 ③符号内的说明文字 应使符号内的说明文字尽可能简明。通常按从左向右和从上向下方式书写,并与流向 无关。如果说明文字较多,符号内写不完,可使用注解符。若注解符干扰或影响到图 形的流程,应将正文写在另外一页上,并注明引用符号。 ④符号标识符 为符号规定标识符是为了便于其它文件引用该符号。便如,程序清单中引用到流程图 中的特定符号。符号标识符一般写在符号的左上角。 ⑤符号描述符 为便于进一步理解符号的功能,可标注符号描述符。通常描述符写在符号的右上角。
5.1.3堆栈段的说明 5.1.3堆栈段的说明
堆栈段是一个特殊的段,在程序中可以定义它,也可以不定义。一个完整 的源程序一般最好定义堆栈段。 如果在程序中不定义堆栈段,那么,操作系统在装入该执行程序时将自动 为其指定一个64K字节的堆栈段。 在源程序中,可用以下方法来定义堆栈段。
方法1 方法1: STACK1 SEGMENT DB 256 DUP(?) TOP LABEL WORD STACK1 ENDS
⑥详细表示
在处理符号或数据符号中画一横线,表明该符号在同一文件集中的其它地言有更为详 细的表示。横线在符号内靠近项端,详细表示的标识符写在符号内横线之上。端点符 用作详细表示的开始符号和结束符号,在此符号中应给出加横线符号中的标识符。 ⑦流线 •标准流向与箭头的使用 •流线的交叉 •流线的汇集 •符号流线进出 •连接符 ⑧多出口判断的两种表示方法 •直接从判断符号引出多条流线 •从判断符号引出一条流线,再从它引出多条流线
段对齐类型与段起始地址之间的对应关系
对齐类型 BYTE WORD DWORD PARA PAGE
起始地址(二进制)
功能说明
最多的空闲字节数 0 1 3 15 127
xxxx xxxx xxxx xxxx xxxx 下一个字节地址 xxxx xxxx xxxx xxxx xxx0 下一个字地址
xxxx xxxx xxxx xxxx xx00 下一个双字地址 xxxx xxxx xxxx xxxx 0000 xxxx xxxx xxxx 0000 0000 下一个节地址 下一个页地址
相关文档
最新文档