80 x86高级汇编技术.ppt_第1页
80 x86高级汇编技术.ppt_第2页
80 x86高级汇编技术.ppt_第3页
80 x86高级汇编技术.ppt_第4页
80 x86高级汇编技术.ppt_第5页
已阅读5页,还剩133页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、80 x86 高级汇编技术,结构数据与汇编语言程序设计 记录数据与汇编语言程序设计 宏汇编与汇编语言程序设计 重复汇编与汇编语言程序设计 条件汇编与汇编语言程序设计,结构数据与汇编语言程序设计,结构数据与汇编语言程序设计,结构数据与现代汇编语言程序设计 结构数据具有的基本特征: 一类包含成员的聚合数据对象 所含成员的类型可以是各不相同的 可列表给出结构数据所含的成员 可基于成员列表按相对位置访问结构的成员 处理操作可以是面向结构对象的、也可以是面向确定结构对象的指定成员的 成员可以是简单对象也可以是聚合对象 不同结构数据所含的成员数、成员组成是不同的 结构对象及其成员应当既可以通过名字来直接访

2、问(成员数据的名字仅在结构中是有意义的),也可通过“指针”来访问,结构数据与汇编语言程序设计,结构数据与现代汇编语言程序设计 数据文件的内容可被以结构来有效描述 组成数据文件的记录也可被以结构来有效描述 一个数据文件的所有记录都可以是同一种类型的结构对象,这时,文件的内容可被定义为确定类型的“结构数组” 数据文件通常被保存在磁盘上(“磁盘文件”) 管理磁盘文件是操作系统的重要功能,而“汇编语言虚拟机”是基于“操作系统虚拟机”被定义的 在现代数据处理应用问题中,涉及到大量的数据文件处理问题,数据文件的高效处理是数据处理系统高效处理问题信息的关键性环节 为了提高大型数据处理系统的系统有效性,在现代

3、,利用汇编语言的高效率特征、开发可被高级语言程序有效利用的、实现数据文件内容高效处理的汇编语言子程序是必要的,结构数据与汇编语言程序设计,结构数据与现代汇编语言程序设计 在现代数据处理系统开发中,有: 问题涉及到大量的数据文件处理操作 相关计算机系统为文件操作的高效进行提供了许多硬件新技术支持,这些先进特征通常不能为高级语言程序有效利用 利用汇编语言作为编程语言开发高效组织数据文件内容、实现数据文件系统高效操作的、可为高级语言程序引用的汇编语言子程序,对提高数据处理系统的系统有效性是极为有利的 80 x86汇编语言提供了“结构”数据处理支持机制,在汇编语言程序设计中利用这一设施开发实现数据文件

4、信息的系统高效处理的、可被高级语言程序引用的汇编语言子程序,对提高现代数据处理系统的高效性是极为有利的,结构数据与汇编语言程序设计,汇编语言的结构数据支持机制 “结构” 一种系统数据组织机制,而不是一种“类型” 在汇编语言程序设计中使用“结构数据”的基本过程: 说明结构类型 定义结构变量(或者结构数组) 处理结构对象或结构对象的成员 说明结构类型 说明结构类型处理完成: 命名一个结构类型 给出一个具体结构类型实例的成员数据列表 说明结构类型的一般格式: 结构名 STRUC 数据定义语句序列 结构名 ENDS,结构数据与汇编语言程序设计,汇编语言的结构数据支持机制 结构数据示例 某普通高等院校面

5、向一门确定课程的“成绩单”,结构数据与汇编语言程序设计,汇编语言的结构数据支持机制 结构类型说明示例 学生成绩信息结构:,SSRLST STRUC ID DB 5 DUP(?) ;学号 NAME DB 8 DUP(?) ;学生姓名 PSSCR DB ? ;平时成绩 EXSCR DB ? ;考试成绩 ZPSCR DB ? ;总评成绩 REMRS DB ? ;备注 SSRLST ENDS,成绩单结构,SSRLST STRUC ;学生个人成绩信息 ID DB 5 DUP(?) ;学号 NAME DB 8 DUP(?) ;学生姓名 PSSCR DB ? ;平时成绩 EXSCR DB ? ;考试成绩 Z

6、PSCR DB ? ;总评成绩 REMRS DB ? ;备注 SSRLST ENDS ; ; SCORLST STRUC ; 成绩单信息 KCNAME DW ? ;课程名称 XSBCODE DD ? ;学生班代码 KAIKEXQ DB ? ;开课学期 XSCHJLST SSRLST 40 DUP () ;学生成绩列表 REKEJIAS DB 8 DUP (?) ;任课教师姓名 SCORLST ENDS,DSEG SEGMENT KCNAME DW ? ;课程名称 XSBCODE DD ? ;学生班代码 KAIKEXQ DB ? ;开课学期 ; XSCHJLST DB 40 DUP( 10 DU

7、P(?), 8 DUP(?), ?, ?, ?, ? ) ; 学生成绩列表 REKEJIAS DB 8 DUP (?) ;任课教师姓名 DSEG ENDS,结构数据与汇编语言程序设计,汇编语言的结构数据支持机制 当不考虑使用结构数据时,对于成绩单数据,相应的数据组织可如下述 这将使相应成绩数据的汇编语言描述与其逻辑特征间的对应关系不清晰、使相应处理程序的可读性变差,难以适应现代软件工程的要求,结构数据与汇编语言程序设计,汇编语言的结构数据支持机制 定义结构变量 说明结构类型只是给出了一个结构类型实例,这并不能为结构数据分配存储空间,通过定义结构变量处理可为一个确定的结构数据分配存储空间 结构变

8、量定义的一般格式: 变量名 结构名 变量名 所定义的结构变量的名,当“变量名”缺省时,相应的结构变量(及其成员数据)不能通过其“名字”来访问 结构名 相应结构类型实例的名(对等于高级语言中的 struct 形式给出的结构类型名),它出现在相应的结构类型说明中,如上述之SSRLST、 SCORLST,结构数据与汇编语言程序设计,汇编语言的结构数据支持机制 字段值表 列表给出一个指定结构变量各成员数据(“字段”)的初始值(由此确定了一个结构变量的初始值)。关于“字段值表 ” ,有: 若“字段值表”缺省,相应变量的初值为说明结构类型时给出的初始值(“缺省初值”) 多值成员不能被重赋初值 只能取“缺省

9、初值” 在定义结构变量时,对 结构变量的字段(成员数据)可不给出初始值,但分隔字段的“,”不能被省略 在定义结构变量时,若所有字段都不赋初值( “字段值表”缺省),则通过给出予以指出 定义结构变量的汇编语言语句在分类上属于“数据定义”伪指令语句,结构数据与汇编语言程序设计,汇编语言的结构数据支持机制 结构变量定义示例 在给出了结构类型实例SSRLST和SCORLST 的说明后,可有: DSEG SEGMENT SZANG SSRLST SWANG SSRLST SLISTU SSRLST WWXUS SSRLST 5 DUP () JWBAN SCORLST WANSB SCORLST JSJ

10、07NJ SCORLST 8 DUP () DSEG ENDS,结构数据与汇编语言程序设计,汇编语言的结构数据支持机制 在给出了如上的结构类型实例SSRLST和SCORLST 的说明、DSEG 数据段给出数据定义后,可有: XUESEN EQU TYPE SSRLST ;常量17 MBAKCJ EQU TYPE SCORLST ;常量695 OFFSET SLISTU ;立即数 22H,34 LENGTH SLISTU ;立即数 1 LENGTH WWXUS ;立即数 5 SIZE SLISTU ;立即数 17 SIZE WWXUS ;立即数 85 LENGTH WANSB ;立即数 1 LE

11、NGTH JSJ07NJ ;立即数 8 SIZE JSJ07NJ ;立即数 5560,结构数据与汇编语言程序设计,汇编语言的结构数据支持机制 访问结构数据的成员(字段) 结构数据的程序处理是面向其成员进行的 汇编语言提供“.”运算符使得既可经由结构变量名来访问结构数据的成员数据,也可通过指向结构变量的指针来访问结构数据的成员数据 经由结构变量名访问结构数据的成员数据的汇编语言描述形式为: 结构变量名. 成员数据名 直接寻址 通过指向结构变量的指针访问结构数据的成员数据的汇编语言描述形式为: 寄存器名. 成员数据名 寄存器相对寻址/相对基址加变址寻址 可用寄存器:BX、BP、SI、DI,结构数据

12、与汇编语言程序设计,实现结构数据处理的汇编语言程序示例 例1:数据文件SCORE.DAT中依次存放着30个学生的成绩记录,文件(成绩)记录具有如下字段: 学号 整数 2字节 姓名 字符串 8字节 语文成绩 整数 1字节 数学成绩 整数 1字节 外语成绩 整数 1字节 写一个程序计算三门课程的总分,把学号和总分依次写到文件SCORE.SUM中 SCORE.SUM文件的记录有两个字段,第一个字段是学号,第二个字段是总分(用2字节表示),结构数据与汇编语言程序设计,实现结构数据处理的汇编语言程序示例 示例程序的实现流程是: 打开文件SCORE.DAT 循环处理每个学生的成绩,把学号和总分依次存入预定

13、义的缓冲区(称为总分表)中 关闭文件SCORE.DAT 建立文件SCORE.SUM 把缓冲区中的内容写入文件SCORE.SUM 关闭文件SCORE.SUM 下面给出的示例程序没有考虑磁盘文件读写出错等情况,;程序名:CHEJICULI ;功 能:(略) ;常量定义 COUNT = 30 ;设学生数为30 ;对应原始成绩的结构SCORE的定义 SCORE STRUC NO DW ? ;学号 SNAME DB 8 DUP () ;姓名 CHN DB 0 ;语文成绩 MATH DB 0 ;数学成绩 ENG DB 0 ;外语成绩 SCORE ENDS ;对应学号和总分的结构ITEM的定义 ITEM S

14、TRUC NOS DW 0 ;学号 SUM DW 0 ;总分 ITEM ENDS,相关结构的类型说明,;数据段 DSEG SEGMENT BUFFER SCORE ;存放原始成绩的缓冲区 STABLE ITEM COUNT DUP () ;预留总分表 FNAME1 DB SCORE.DAT,0 ;文件名 FNAME2 DB SCORE.SUM,0 DSEG ENDS ;代码段 CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START:MOV AX,DSEG MOV DS,AX MOV DX,OFFSET FNAME1 MOV AX,3D00H ;打开文件SCORE.D

15、AT INT 21H MOV BX,AX MOV DI,COUNT ;置循环计数器初值 MOV SI,OFFSET STABLE ;置学号总分 ;缓冲区指针初值,READ:MOV DX,OFFSET BUFFER ;读一个学生的 ;原始成绩 MOV CX,TYPE SCORE MOV AH,3FH INT 21H MOV AL,BUFFER.CHN ;统计总分 XOR AH,AH ADD AL,BUFFER.MATH ADC AH,0 ADD AL,BUFFER.ENG ADC AH,0 MOV SI.SUM,AX ;把总分保存到 ;总分表的当前项 MOV AX,BUFFER.NO MOV S

16、I.NOS,AX ;把学号保存到总分表 ;的当前项 ADD SI,TYPE ITEM ;调整当前总分表当前项 DEC DI ;循环计数控制 JNZ READ,MOV AH,3EH ;关闭文件SCORE.DAT INT 21H MOV DX,OFFSET FNAME2 MOV CX,0 MOV AH,3CH ;建立文件SCORE.SUM INT 21H MOV BX,AX MOV DX,OFFSET STABLE ;写出学号和总分 MOV CX,(TYPE ITEM)*COUNT MOV AH,40H INT 21H MOV AH,3EH ;关闭文件SCORE.SUM INT 21H MOV A

17、X,4C00H INT 21H CSEG ENDS END START,结构数据与汇编语言程序设计,实现结构数据处理的汇编语言程序示例 在示例程序CHEJICULI中,定义了两个结构SCORE和ITEM,用来描述文件记录的字段组成。利用SCORE定义了存放一个原始成绩记录的缓冲区,这样,可方便地引用各字段。还利用ITEM定义了一张总分表,然后借助指向总分表当前项的指针方便地访问当前项的学号和总分字段。此外,程序中还使用了TYPE得到结构的字节数 例2:写一个求字符串长度的子程序 在现代汇编语言程序设计中,提高程序的可读性是非常重要的 当一个汇编语言子程序具有较为复杂的入口参数时,使相应的参数描

18、述符号化对改进程序的可读性、提高软件质量是极为有益的 由于x86汇编语言识别结构数据,且对结构数据提供了基于指针的间接访问支持,这使得利用x86汇编语言的这一特征实现子程序入口参数的符号化成为可能,结构数据与汇编语言程序设计,实现结构数据处理的汇编语言程序示例 本示例的问题分析: 求一个字符串的长度是非数值处理问题中的一个相对独立的问题,应考虑使子程序可被高级语言程序引用 在子程序的入口参数中应当包含被处理字符串的指针(长指针),且该指针应通过堆栈来传递 这样一来,在子程序的入口处,堆栈栈顶的内容就变得比较复杂,在实践中较易出错(需通过BP来获取被处理串的指针),若能将其符号化,势必会改善子程

19、序的可读性、降低出错概率 若能利用x86汇编语言的结构数据支持能力将子程序入口处堆栈栈顶内容描述为一个结构数据,上述目标是不难实现的 以下给出的示例程序即是按此设想来实现的,结构数据与汇编语言程序设计,;字程序名:STRLEN ;功 能:测字符串长度 ;入口参数:字符串首地址的段值和偏移在堆栈顶 ;出口参数:AX=字符串长度 ;说 明:(1)字符串以0结尾;字符串长度不包括结尾标志 ; (2)本过程是一个远过程 为了方便地表达堆栈参数,先定义如下结构: PARM STRUC BPREG DW ? ;对应BP寄存器保存单元 RETADR DD ? ;对应返回地址 STROFF DW ? ;对应入

20、口参数中的偏移 STRSEG DW ? ;对应入口参数中的段值 PARM ENDS,STRLEN PROC FAR PUSH BP MOV BP,SP PUSH DS PUSH SI MOV DS,BP.STRSEG ;取字符串首地址的段值 MOV SI,BP.STROFF ;取字符串首地址的偏移 XOR AL,AL STRLEN1:CMP BYTE PTR SI,AL JZ STRLEN2 INC SI JMP STRLEN1 STRLEN2:MOV AX,SI SUB AX,BP.STROFF POP SI POP DS POP BP RET STRLEN ENDP,结构数据与汇编语言程序

21、设计,实现结构数据处理的汇编语言程序示例 在以上示例程序中,有: 说明了结构类型PARM,但没有定义PARM类型的变量,其作用是使汇编程序知晓PARM及其所含成员 将子程序中压入的BP内容定义为PARM的成员,为操作子程序栈顶的内容提供了方便 将SP内容传入BP,使通过BP(以BP为指针)访问位于栈顶的PARM 类型结构成为可能 这样一来,作为参数的“被处理字符串的指针”也就简便地实现了符号化,子程序的特性由此得以改善 如果不这样处理,子程序需要使用基于BP的“寄存器相对寻址”方式访问堆栈区从栈顶获取作为参数的“被处理字符串的指针” ,这一方面容易产生错误(相应的Disp需人工计算),相应子程

22、序的可读性也较差,记录数据与汇编语言程序设计,记录数据与现代汇编语言程序设计 80 x86汇编语言的记录数据支持机制 实现记录数据处理的汇编语言程序示例,在现代计算机应用中,声音、图像等成为一类重要的软件对象,对之,一些计算机中引入了相应的机器指令来处理这类数据。然而,也有许多计算机未提供相应的机器指令,在这样的机器中,相关数据的处理由软件来实现。由此使得开发处理这类数据的软件成为现代汇编语言程序设计的一项重要内容。 与之相适应,80 x86汇编语言引入了对应于一些高级语言中的“位段”类型的“记录”数据。本部分将系统讨论以下几个有关的问题:,记录数据与汇编语言程序设计,记录数据与现代汇编语言程

23、序设计 在现代汇编语言程序设计中,如下两类问题是与80 x86汇编语言中的记录数据及其处理机制的应用紧密关联的: 新媒体数据的处理 数据文件信息的处理 新媒体数据的处理 如图像、声音等信息的处理。其一般的系统记录机制是: 对相应的元数据用多个二进制位进行编码 以多个元数据为基础建立一个多维的描述系统来描述一个基本元素 以基本元素的规则组合来描述对象 以机器数据字分段组织元数据 基于逻辑(包括“移位”)运算实现相关数据的处理,记录数据与汇编语言程序设计,记录数据与现代汇编语言程序设计 数据文件信息的处理 由于现代32位/64位计算系统已经成为主流的计算系统,这使得数据文件的处理也可采取与新媒体数

24、据的处理类似,相应地,有: 通过编码(重编码)用若干个连续的二进制位来定义文件记录的“字段” 使一个机器字包含多个文件记录的“字段” 用一个或多个机器字基于“位段”来定义一个数据文件的记录 由此可使数据文件的空间资源占用被有效压缩 机器提供面向长“位段”的指令以支持高效的“位串”存储与传送操作,从而使分布式数据处理系统可得以高效运行 80 x86汇编语言以此为出发点引入了“记录数据”,记录数据与汇编语言程序设计,80 x86汇编语言的记录数据支持机制 在80 x86汇编语言中,称具有以下特征的数据为“记录” : 它们由一个以上的“字段”顺序关联构成 一个字段由一个以上连续的二进制位组成(特殊情

25、况下一个字段可仅为一个二进制位) 一个记录所含的字段间可以连续也可不连续 一个记录所含字段的总位数可以是8位或16位,在32位系统上可为32位,同时: 若记录所含总位数小于或等于8(含空出的二进制位,下同),则称相应记录为“字节记录” 若记录所含总位数大于8但小于或等于16,则称相应记录为“字记录” 若记录所含总位数大于16但小于或等于32,则称相应记录为“双字记录” (仅32位系统),记录数据与汇编语言程序设计,80 x86汇编语言的记录数据支持机制 在80 x86汇编语言中,使用记录数据的过程为 : 说明记录类型 定义记录变量 处理记录变量或其确定字段 在80 x86的汇编语言中, “记录

26、”被认为是一种“类型模板” (类同于“结构”),需要通过“类型说明”来引入一个记录类型实例(只有这样的记录类型才能用于定义记录变量) “说明记录类型”的作用是在相应汇编语言程序中引入一个确定的记录类型实例,指出: 一个记录类型的类型名(该类型名可被用以定义相应的记录变量,类同于DB、DW等) 指出一个记录类型所包含的字段 给出各字段的汇编语言描述,记录数据与汇编语言程序设计,80 x86汇编语言的记录数据支持机制 关于“说明记录类型” ,有: 使用伪指令语句RECORD来说明记录类型 伪指令语句RECORD的一般格式是: 记录名 RECORD 字段 ,字段, 其中“记录名”是80 x86汇编语

27、言中的“名字” ,该名字为一个记录类型实例的“类型名” “字段 ,字段, ”给出一个具体记录类型所含各字段的字段描述信息 每个字段的“字段描述信息”的内容包括: 字段名 汇编语言可识别的名字 字段宽度 字段所占的二进制位数 字段缺省初值 可缺省,缺省时为0,记录数据与汇编语言程序设计,80 x86汇编语言的记录数据支持机制 一个具体记录类型所含字段的“字段描述信息”说明的一般格式为: 字段名:宽度 = 表达式 字段名 使得在程序中可通过命来符号化地访问字段,以改善程序的可读性 字段宽度 必须是常数,其值不能超过机器字长 字段缺省初值 为相应类型的记录变量准备的缺省初值,它使得在定义该类型的记录

28、变量时可不为变量的相应字段赋初值而取此缺省初值 以下是两个记录类型说明的示例: COLOR RECORD BLINK:1,BACK:3, INTENSE:1, FORE:3 ABCD RECORD AA: 5=12,BB: 3 = 6,CC: 4 = 3,记录数据与汇编语言程序设计,80 x86汇编语言的记录数据支持机制 80 x86汇编语言程序中,可用记录类型规格上的限制: 字节记录 记录类型各字段的宽度之和不超过8 字记录 记录类型各字段的宽度之和不超过16 双字记录 记录类型各字段的宽度之和不超过32(仅在32位以上系统上可用) 在程序给出相应的记录类型说明后,汇编程序将自动按照上述规格

29、来规整记录类型 在汇编程序按照规格规整记录类型时,若记录类型说明给出的总宽度未达到规格定制的位数,则在高位补充相应数量的“0”作为“空”字段,使之按相应规格被存储、使用 记录变量的定义 针对确定的记录类型(记录类型实例)组织相应记录数据的存储器映像,其一般格式为: 变量名 记录类型名 ,记录数据与汇编语言程序设计,80 x86汇编语言的记录数据支持机制 关于80 x86汇编语言的“定义记录变量” ,有: 说明记录类型仅仅使汇编程序能将相应的名字作为记录类型实例来识别处理,并不能为汇编语言程序提供记录对象(程序由此并不能直接处理记录数据) 定义记录变量为汇编语言程序提供确定记录类型的记录对象并静

30、态分配其存储单元(因而相应伪指令语句应出现在确定数据段的描述中) 在定义记录变量时,可缺省“变量名” ,但由此将使相应记录变量不能在汇编语言程序中通过名字来访问 引入记录数据使得汇编语言程序不仅能够以名字访问记录变量、扩展程序的对象类型,而且使程序可以记录的字段作为处理对象、通过名字来访问一个记录变量的确定字段从而有效改善汇编语言程序的可读性,记录数据与汇编语言程序设计,80 x86汇编语言的记录数据支持机制 这使得在定义记录变量时可如定义结构变量那样,为记录变量的字段确立初值(由此使一个记录变量具有程序可用的初始值) 在定义记录变量时,字段的初始值也可缺省,缺省表示相应字段的初值取记录类型说

31、明时给出的缺省初值 在定义一个含多个字段的记录变量时,若仅缺省其中部分字段的初值,则相应的分隔符(“,”)不能省略 在定义一个记录变量时,若所有字段都缺省初值,则可通过给出“”来实现 记录变量定义示例 基于已说明的记录类型COLOR: WARNING COLOR ; 字节的值为8CH COLOR ; 字节的值为36H COLORLST COLOR 32 DUP () ; 32 个字节,记录数据与汇编语言程序设计,80 x86汇编语言的记录数据支持机制 记录数据支持机制的引入使得在汇编语言程序设计中,程序可根据需要访问一个记录变量或其一个指名的字段 然而,80 x86系列机并没有直接处理记录字段

32、的机器指令,这使得: 程序需要有从一个记录变量(或其寄存器映像)中析取(分离出)一个指名字段(屏蔽记录变量中的其他字段)的支持手段 程序需要有将一个记录变量(或其寄存器映像)的指名字段的内容移位到一个记录变量的最低部分(由此使相应字段可占据自D0起的若干个二进制位)的支持手段 程序需要有获得一个记录变量(或其寄存器映像)的指名字段的宽度的支持手段(以便实现相关的程序设计处理 如判定字段内容的合法有效性等),记录数据与汇编语言程序设计,80 x86汇编语言的记录数据支持机制 仅当程序员可从汇编语言获得相应的支持,才能有效赋予相应汇编语言程序以记录数据处理能力、使相应汇编语言程序满足软件工程的可读

33、性要求 80 x86汇编语言提供了相应的“记录专用操作符”以供程序员作为处理相关问题的手段: 操作符WIDTH 用之可求得一个记录类型/记录变量的宽度或者一个记录数据中指名字段的“宽度” 操作符MASK 用之可求得一个“逻辑尺” ,利用由此得到的“逻辑尺”可从一个确定类型的记录变量(或其寄存器映像)中析取已被定义为相应记录数据的部分或者其一个指名字段的内容(屏蔽记录变量或其寄存器映像中的其他部分) 记录字段名 特殊操作符,用之可求得将该字段移到所在记录的最右端所需移动的位数,记录数据与汇编语言程序设计,80 x86汇编语言的记录数据支持机制 设记录COLOR如上面的说明,则有: SUB AL,

34、WIDTH COLOR ;SUB AL,8 MOV DH,WIDTH BACK ;MOV DH,3 ADD BH,WIDTH INTENSE ;ADD BH,1 关于操作符MASK,对于上述已说明的记录数据,有: MOV AL,MASK BLINK ;MOV AL,10000000B OR AH,MASK FORE ;OR AH,00000111B AND DX,MASK ABCD ;AND DX,0FFFH 关于记录字段名操作符(记录数据关联操作符),对于上述已说明的记录数据,有: MOV CL,BLINK ;MOV CL,7 MOV CL,INTENSE ;MOV CL,3,记录数据与汇编

35、语言程序设计,实现记录数据处理的汇编语言程序示例 学籍管理之成绩卡管理 在普通高校的学生学籍管理中,需要系统地记录学生自入学以来的所有课程的成绩,设相关的信息包括: 课程代码 6位二进制代码 成绩标识 指出是正常考试所的成绩、一次重修获得的成绩还是二次及以上重修获得的成绩 课程成绩的记分制标记 假定成绩可取百分制成绩或者等级成绩(等级成绩以代码表示) 课程成绩 假定用字记录数据来描述一门课程的成绩 问题:开发几个汇编语言子程序以实现成绩卡所含信息的读出、“成绩标识 ”的改动等功能,记录数据与汇编语言程序设计,记录数据与汇编语言程序设计,实现记录数据处理的汇编语言程序示例 下面给出两个面向学生成

36、绩卡记录数据的子程序: 读出一门指定课程的成绩信息子程序REDSCR 补充一门指定课程的重修成绩子程序RCRSCR 子程序REDSCR将主调模块传入的一位学生一门课程的成绩卡信息分离成四个组成部分记入一个指定的结构数据中,各部分数据都靠最右端(低位部分)存放 子程序RCRSCR负责将学生在通过一门课程的重修考试后的成绩登记到给定的成绩卡记录数据中(改变其中的低位部分三个字段的内容) 这两个子程序都被要求可被高级语言程序所调用 这两个子程序都满足前述的有关规范 这两个子程序都未经严格测试,记录数据与汇编语言程序设计,实现记录数据处理的汇编语言程序示例 读出一门指定课程的成绩信息子程序REDSCR

37、,;子程序名: REDSCR ;功 能:将一门课程的学籍卡信息中的四个数据项分 ; 离,存入指定结构数据的相应字段中 ;入口参数:AX 待处理的学籍卡信息 ; 指向结果结构数据的指针(段值:偏移)在堆栈中 ;出口参数:在给定指针所指结构变量中 ;调用实例: MOV AX, ; PUSH ; PUSH ; CALL FAR PTR REDSCR,scorlist STRUC codclas DB ? ; 课程代码 rermark DB ? ; 重修情况标记 rusmark DB ? ; 记分制标记 scorecd DB ? ; 成绩/成绩代码 scorlist ENDS ; scard RECO

38、RD kcdm:6,cxbj:2,jfzm:1,score:7 ;学籍卡记录 ; REDSCR FAR PUSH BP ;保护寄存器BP MOV BP, SP PUSH DS ; 保护其他寄存器 PUSH BX PUSH CX PUSH DX PUSH SI MOV DS, BP + 8 ;获取结果结构指针段值 MOV BX, BP + 6 ;获取结果结构指针偏移,MOV SI, MASK kcdm ; 获取析取kcdm的逻辑尺 MOV CL, kcdm ; 获取移位kcdm的移位次数 AND SI, AX ;取出“课程代码”字段 SHR SI, CL ;移位到最右端 MOV DX. SI M

39、OV BX . codclas,DL ; 保存“课程代码” MOV DX, MASK cxbj MOV CL, cxbj AND DX, AX SHR DX, CL MOV BX. rermark,DL ; 保存“课程重修情况标记” MOV DX, MASK jfzm MOV CL, jfzm AND DX, AX MOV BX . rusmark,DL ;保存“记分制标记” MOV DX, MASK score AND DX, AX MOV BX . scorecd, DL ;保存成绩/成绩代码,POP SI ;恢复寄存器 POP DX POP CX POP BX POP DS POP BP

40、 RET 4 ;返回, 平衡堆栈 REDSCR ENDP,记录数据与汇编语言程序设计,记录数据与汇编语言程序设计,实现记录数据处理的汇编语言程序示例 补充一门指定课程的重修成绩子程序RCRSCR,;子程序名: RCRSCR ;功 能:将一门课程的重修成绩添加到给定的 ; 学籍卡信息中 ;入口参数:AX 待处理的学籍卡信息 ; DH 待添加成绩的记分制模式(最低位) ; DL 待添加的成绩/成绩代码 ;出口参数:AX 结果学籍卡信息 ;调用实例: MOV AX, ; MOV DH, ; MOV DL, ; CALL FAR PTR RCRSCR,scard RECORD kcdm:6,cxbj:

41、2,jfzm:1,score:7 ;学籍卡记录 ; RCRSCR FAR PUSH BX ;保护寄存器 PUSH SI PUSH CX MOV SI, MASK cxbj ; 重修标记处理 MOV CL, cxbj MOV BX, SI NOT SI AND BX, AX SHR BX, CL INC BX CMP BX, 2 JBE RCRSC1 MOV BX, 2 RCRSC1: SHL BX, CL AND AX, SI OR AX, BX,MOV CL, jfzm ;记分制模式处理 MOV SI, MASK jfzm NOT SI MOV BL, DH XOR BH, BH SHL B

42、X, CL AND AX, SI OR AX, BX MOV SI, MASK score ;成绩处理 MOV BL, DL XOR BH, BH NOT SI AND AX, SI OR AX, BX POP CX ;恢复寄存器 POP SI POP BX RET RCRSCR ENDP,宏汇编与汇编语言程序设计,宏与现代汇编语言程序设计概论 宏指令的定义与使用 关于宏的用途的讨论 宏指令的参数与带参的宏 特殊的宏运算符 宏与子程序的区别 与宏有关的汇编语言伪指令 宏定义的嵌套,宏汇编与汇编语言程序设计,宏与现代汇编语言程序设计概论 随着计算机技术的发展,软件工程获得了普遍地应用 在软件工程

43、的技术框架下,模块化方法得到广泛应用 为了优化软件结构,人们提出了使组成软件产品的模块满足以下条件的工程化软件开发原则: 模块应当具有单一的功能 模块应当具有单一的入口和单一出口 模块应当具有高内聚、低耦合 为了满足实践不断增长的软件产品需求,人们要求软件工程应当不断地提高软件开发的劳动效率 在程序的编码上,为了既能满足软件结构优化的要求又能减少重复的编码劳动以提高编码工作的劳动效率,人们首先在汇编语言中提出了“宏”的概念、使传统的汇编语言发展成了“宏汇编语言” (支持“宏”的汇编语言),宏汇编与汇编语言程序设计,宏与现代汇编语言程序设计概论 关于汇编语言的“宏” ,有: 在传统的软件技术下,

44、人们为了压缩一个软件的代码量,将不同软件单元中的“共有”代码片断以至 “相似”代码片断抽出、做成“多功能子程序” (“公共模块”) 随着软件规模的迅速膨胀,人们发现这种程序设计策略严重地损害了软件的“可维护性” 对之,人们提出了如下处置策略: 把这些“共有”代码片断独立命名,称为“宏” ;把那些“相似”代码片断通过“参数化” 整理为单一的代码片断并独立命名,使成为“宏” 在进行程序编码时允许在程序代码中使用“宏”的名字来代替相应代码片断 由此来达到降低软件代码量的目的,宏汇编与汇编语言程序设计,宏与现代汇编语言程序设计概论 在程序被汇编前先将程序中含有的“宏”由软件(而非人工)将其“扩展”为相

45、应的源码片断、再交由翻译程序进行翻译处理(这一过程称为“宏代换”) 通过上述系列策略的应用,可使得: 由程序员编写的代码量被有效缩减 组成一个软件产品的模块可仅具有单一的功能(由此带来的模块间存在“共有”代码片断/ “相似”代码片断问题可通过引入“宏”来缩减程序员的工作量) 软件产品的“可维护性”可得以显著改善 汇编语言的这种“宏”支持机制后来被引入到高级语言中来,人们称其为“高级语言的宏”,宏汇编与汇编语言程序设计,宏指令的定义与使用 “宏”指令的定义 “宏”的使用是始于“宏定义”的,通过宏定义,为一段汇编语言代码给定一个名字,由此即在相应的汇编语言程序中引入了一条“宏指令” 一旦定义了一条

46、宏指令,它就如同汇编语言所提供的其他指令(机器指令、伪指令)一样,可在汇编语言程序设计中应用 宏汇编语言提供了两条伪指令以供程序员定义宏指令,它们如同一对括号括起作为宏的内容的代码片断 通过应用这对伪指令,程序员为相应的宏给出一个名字,由此使被括起的程序片断与此名字等价,该名字即是所定义的宏指令的名 80 x86汇编语言所提供的一对伪指令分别是: 伪指令MACRO 这对“括号”中的“左”括号 伪指令ENDM 这对“括号”中的“右”括号,宏汇编与汇编语言程序设计,宏指令的定义与使用 宏定义的一般格式如下: 宏指令名 MACRO 形式参数表 . . . ENDM 在宏定义中,伪指令MACRO 和E

47、NDM必须成对出现,表示宏定义的开始和宏定义的结束 MACRO和ENDM之间的内容称为宏定义体 宏定义体是由指令、伪指令和宏指令构成的程序片断 宏指令名由用户指定,适用一般标号命名规则 可选的形式参数表可由若干参数组成,各形式参数间用逗号分隔,宏汇编与汇编语言程序设计,宏指令的定义与使用 宏指令定义示例 下面的宏定义将转换AL中低4位内容为一个ASCII字符的程序片断定义为宏指令HTOASC: HTOASC MACRO AND AL,0FH ADD AL,90H DAA ADC AL,40H DAA ENDM 在定义了宏指令HTOASC后,即相当于为80 x86汇编语言增加了一条指令(“宏指令

48、”) 基于此,程序员在编写汇编语言程序的过程中若遇到了需要完成转换十六进制数字(十进制数字)为ASCII码的编程需求时,即可使用之,宏汇编与汇编语言程序设计,宏指令的定义与使用 下面的程序片断将保存在AL中的组合BCD码转换为两个ASCII字符存于寄存器AX中 MOV AH,AL SHR AL,1 SHR AL,1 SHR AL,1 SHR AL,1 HTOASC XCHG AH,AL HTOASC 对之,学生可以: 了解宏指令的定义 使用过程 可将宏与子程序进行比较,宏汇编与汇编语言程序设计,宏指令的定义与使用 宏调用 在定义了宏指令后,就可使用宏指令来表示对应的程序片段(如上例),这称为宏

49、调用 宏调用的一般格式如下: 宏指令名 实参数表 如果相应宏指令的定义中缺省“形式参数表 ” (如上例),则宏调用中不出现可选的“实参数表 ”部分 实参数表中的实参数应该与宏定义时的形式参数表中的形式参数相对应 在对源程序进行汇编时,宏汇编程序先把源程序中的宏指令替换成对应的宏定义体(这称为“宏代换”),再将所得到的不包含宏指令的汇编语言源程序翻译为相应的目标代码 对上述示例程序片断,经过宏代换后的代码为:, MOV AH,AL SHR AL,1 SHR AL,1 SHR AL,1 SHR AL,1 1 AND AL,0FH 1 ADD AL,90H 1DAA 1 ADC AL,40H 1DA

50、A XCHG AH,AL 1 AND AL,0FH 1 ADD AL,90H 1DAA 1 ADC AL,40H 1DAA ,宏汇编与汇编语言程序设计,宏汇编与汇编语言程序设计,关于宏的用途的讨论 在程序设计实践中,通常使用宏来达到以下目的: 缩短源代码 扩充指令集 改变某些指令助记符/伪指令的定义符的意义 通过定义宏指令缩短程序源代码的长度 在现代程序设计实践中,由于强调软件结构的优化,软件工程要求使组成软件产品的模块具有单一的功能,这使得程序员经常会遇到以下情况: 多个程序模块中含有相同的一个代码片断 多个程序模块中含有一段相似/相近的代码,使得若简单地改变少许程序成分,可用一个程序片断来

51、统一的实现之,宏汇编与汇编语言程序设计,关于宏的用途的讨论 当上述情况发生时,可将相应的程序片断定义为宏指令,从而: 此后,在需要这个程序片断之处安排一条对应的宏指令就行了 由此能有效地缩短源代码 能有效减少编辑汇编语言源程序过程中的错误 例如,在开发执行输入输出任务的汇编语言程序时,经常需要进行回车换行处理,以便使后续程序的输入输出行为从一个新行开始 为此,可将实现回车换行的程序片断定义为一条宏指令(设为此宏指令命名CRLF) 由此可压缩相关程序的源代码长度,相应的宏定义可如下面这样:,宏汇编与汇编语言程序设计,CRLF MACRO PUSH DX PUSH AX MOV DL,0DH MO

52、V AH, 2 INT 21H MOV DL, 0AH MOV AH, 2 INT 21H POP AX POP DX ENDM,宏汇编与汇编语言程序设计,关于宏的用途的讨论 通过定义宏指令扩充指令集 CPU的指令集是确定的,但利用宏能在汇编语言中在形式上对指令集进行扩充 扩充后的指令集是机器指令集与宏指令集的并集。这不仅能方便源程序的编写,而且便于阅读理解源程序 在写子程序和中断处理程序时,为了保护现场,常常需要把8个通用寄存器全部压入堆栈,但8086/8088指令集中没有把8个通用寄存器全部压栈的指令。 为此,我们可定义一条宏指令PUSHA,由它实现把8个通用寄存器全部压入堆栈的功能(宏指

53、令PUSHA 的宏定义见下一屏) 在定义了上述宏指令PUSHA后,每当需要把8个通用寄存器全部压栈时,就可以使用PUSHA指令了 与宏指令PUSHA相对应,我们还可定义宏指令POPA实现把由PUSHA压栈的8个通用寄存器依次退栈的功能,宏汇编与汇编语言程序设计,PUSHA MACRO PUSH AX PUSH CX PUSH DX PUSH BX PUSH SP PUSH BP PUSH SI PUSH DI ENDM,宏汇编与汇编语言程序设计,关于宏的用途的讨论 通过定义宏指令改变某些指令助记符/伪指令的定义符的意义 宏指令名可以与指令助记符或伪伪指令名(伪指令定义符)相同,在这种情况下,宏指令的优先级最高,而同名的指令或伪指令就失效了 利用宏指令的这一特点,可以改变指令助记符/伪指令定义符的意义 例如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论