850 likes | 1.05k Views
《 微机原理与接口技术 》 第五章、第六章. 主讲:方义秋. 第 5 章 宏汇编语言 本章学习目标 通过本章的学习,应当掌握以下内容: • 了解汇编语言的基本知识和特点。 掌握宏汇编基本语法。 • 掌握汇编语言常用伪指令的使用方法。 • 熟悉宏汇编语言的程序结构、段定义以及语句的格式。. 汇编语言与宏汇编语言. 汇编语言 是一种面向 CPU 指令系统的程序设计语言,它采用指令助记符来表示操作码和操作数,用符号地址表示操作数地址。
E N D
《微机原理与接口技术》第五章、第六章 主讲:方义秋
第5章 宏汇编语言 • 本章学习目标 • 通过本章的学习,应当掌握以下内容: • •了解汇编语言的基本知识和特点。 • 掌握宏汇编基本语法。 • •掌握汇编语言常用伪指令的使用方法。 • •熟悉宏汇编语言的程序结构、段定义以及语句的格式。
汇编语言与宏汇编语言 • 汇编语言是一种面向CPU指令系统的程序设计语言,它采用指令助记符来表示操作码和操作数,用符号地址表示操作数地址。 • 汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。 • 汇编程序是最早也是最成熟的一种系统软件,它除了能够将汇编语言源程序翻译成机器语言程序这一主要功能外,还能够根据用户的要求自动分配存储区域,包括程序区、数据区、暂存区等;自动把各种进制数转换成二进制数,把字符转换成ASCII码,计算表达式的值等;自动对源程序进行检查,给出错误信息,如非法格式、未定义的助记符、标号、漏掉操作数等。具有这些功能的汇编程序称为基本汇编ASM(Assembler)。
在基本汇编的基础上,进一步允许在源程序中把一个指令序列定义为一条宏指令,并包含有大量伪指令的汇编程序,叫做宏汇编MASM(MacroAssembler)。它包含全部基本汇编ASM的功能,还增加了宏指令、结构、记录等高级汇编语言功能。在基本汇编的基础上,进一步允许在源程序中把一个指令序列定义为一条宏指令,并包含有大量伪指令的汇编程序,叫做宏汇编MASM(MacroAssembler)。它包含全部基本汇编ASM的功能,还增加了宏指令、结构、记录等高级汇编语言功能。
5.1 汇编程序的语句类型 1.汇编程序采用分段结构,每一段有若干语句组成。 2.语句分类: 指令性语句,即符号指令——通知CPU进行某种操作的命令,由硬件完成其功能。 指示性语句,即伪指令——提供编译信息、链接信息,其功能由相应的软件完成。 3.符号指令的书写格式: [标号:] 符号指令 [;注释] 4.伪指令的书写格式: [变量名] 伪指令 [;注释] 注:版本不同,伪指令的种类也略有不同。
5.2 宏汇编基本语法 5.2.1 标号、变量和常量 1.标号和变量——又称符号地址 标号——代表指令地址,定义在代码段,为转移指令提供目标。 变量——代表内存操作数的存储地址,或者说变量名就代表某个单元。定义在DS,ES,FS,GS,SS段。 命名规则:不能用保留字、仅能使用给定集合的符号、不能用数字打头、最长不超过31个字符。
标号和变量的3个属性 段属性:其所在的段基址,用SEG运算符可算出。 例:MOV AX,SEG BUF 偏移属性:用OFFSET运算符可算出其有效地址。 例:MOV BX,OFFSET BUF 类型属性: 变量的类型有: 字节型:用DB伪指令定义 字型: 用DW伪指令定义 双字型:用DD伪指令定义 四字型:用DQ伪指令定义 五字型:用DT伪指令定义 注:使用时,可用PTR运算符作临时性的修改 标号的类型有: NEAR(近):该类型标号是段内转移指令的目标地址 FAR(远):该类型标号是其他代码段转移指令的目标地址
2.常量 立即数:经汇编后转换成等值的二进制补码。如: 12,0A8H,10100000B,34Q,-2 字符串常数:经汇编后转换成相应的ASCII码。如: ‘A’,‘ABCD’,‘3’ 例:X DB ‘ABC’;相当于 X DB 41H,42H,43H MOV DL,‘1’;DL=31H 符号常数:用伪指令EQU或“=”定义。 例:COUNT EQU 55 POINTER = 2F8H ······ MOV CL,COUNT ;CL=55 MOV DX,POINTER ;DX=2H8H
5.2.2 运算符 1.数值运算符 (1)算术运算符有: +、—、*、/、MOD(模除,即取余) 例: MOV AX,8+5 ;汇编时完成运算,其值若出界给出错误信息。 MOV AX,31 MOD 5 ;AX=1 (2)逻辑运算符有: NOT:按位取反例:MOV AL,NOT 10010011B;AL=01101100B AND:按位相与例:MOV AL,37H AND 0FH ;AL=07H OR:按位相或例:MOV AL,7 OR 30H ;AL=37H XOR:按位异或例:MOV 0AAH XOR 55H ;AL=0FFH HIGH:截取高8位例:MOV AH,HIGH BX ;BH→AH LOW:截取低8位例:MOV AL,LOW BX ;BL→AL
(3)关系运算符有: 注:关系运算符为“真”时,结果为“-1”(即全1),否则为0。
2.修改类型属性的运算符——PTR运算符 格式: 类型的说明符 PTR 地址表达式 类型说明符有: BYTE(字节) WORD(字) PTR 内存操作数的5种寻址之一 DWORD(双字) NEAR(近) FAR(远) PTR 转移地址标号/过程名
3.返回属性或数值的运算符 (1)求某个逻辑段/变量/标号的段基址运算符SEG 格式:SEG 段名 【例】 MOV AX,SEG DATA ;AX=名为DATA逻辑段的段基址 MOV DS,AX 【例】 XYZ DW 1234H …… MOV AX,SEG XYZ ;AX=变量XYZ所在段的段基址 (2)取变量/标号的偏移地址运算符OFFSET 格式: OFFSET 变量名或标号 【例】 MOV BX,OFFSET XYZ ;BX=变量XYZ的偏移基址
(3)返回变量或标号的类型 TYPE 格式:TYPE 变量/标号 功能:返回变量类型:字节=1,字=2,双字=4; 返回标号类型:NEAR=—1,FAR=-2。 例:MOV AX,TYPE XYZ ;AX=2 (4)$运算符,返回汇编计数器的当前值。 用法:紧跟在DB,DW,···伪指令之后,统计出分配给某个变量的单元数。 例: XYZ DW 1234H,5678H COUNT EQU $-XYZ ;COUNT=4
4.方括号运算符和地址表达式 [地址表达式]——是内存操作数的常用寻址方式。 [下标]——表示用下标访问数据元素,直接寻址. 例: XYZ DW 1234H,5678H MOV BX, XYZ[2] ;BX=78H
5.3 数据定义的伪指令 1.等值伪指令 格式: 符号常数 EQU 表达式 例:XX EQU 22H ;XX代表22H 特点:符号常数在后继语句中不能更改。 2.等号伪指令 格式: 符号常数 = 表达式 例:XX = 22H ;XX代表22H, 特点:在后继语句中可以重新定义: XX=XX+1 注:符号常数可定义在任意逻辑段中,要先定义后使用。
3.字节定义的伪指令 格式:变量名 DB 一串用逗号间隔的单字节数 例:BUF1 DB 22H,5*6,10101010B ;BUF1为字节型的变量 DB 120,-5,0A6H,‘HELLO’;分配11个单元。 COUNT EQU $-BUF1 ;统计出BUF1变量的单元数→符号常数,COUNT=11 BUF2 DB ?,?,10 DUP(‘A’) ;?为随机数,共分配12单元。
4.字定义的伪指令 WNUM 格式:变量名 DW 一串用逗号间隔的双字节数 功能:通知汇编程序,把所定义的双字节数从指定变量开始依次存放。规律:低对低,高对高 例:WNUM DW 1234H,56,‘AB’,‘C’,? COUNT EQU $-WNUM ;COUNT=10 注:DW伪指令中的字符串常数,单引号内只能是一个或两个字符,‘C’编译后为0043H。 5.多字节定义的伪指令 格式:变量名 DD/DF/DQ/DT 一串用逗号间隔的多字节数 说明:伪指令DD/DF/DQ/DT 为所定义的每一个数, 分配4个、6个、8个、10个单元。 例5.3.1(P.76)
5.4 宏汇编语言基本语法 本节主要解决程序的结构: 说明CPU的类型 定义逻辑段结构 说明段约定 定义过程 返回DOS系统 说明程序的结束
1.方式选择伪指令指明使用的CPU类型 格式及功能: .8086 ;只汇编8086、8088指令 .486 ;80486及以下实模式指令 .486P ;80486及以下全部指令 缺省 ;与设置.8086等价 位于源程序的第一条指令。
2.段定义语句——即逻辑段的定界语句 格式: 段名 SEGMENT 定位参数 链接参数 ‘分类名’ 段长度 段体 称为属性参数(可选) 段名 ENDS 属性参数为源程序的汇编、链接提供必要的信息,用于模块化设计: 各模块单独编译,单独汇编,生成各自的OBJ文件,然后通过链接程序将各OBJ文件链接起来,生成一个EXE文件。 不同模块之间,同名段如何链接、如何定位?
(1)定位参数(段对齐)——通知链接程序,逻辑段的目标代码在存储器中如何存放(1)定位参数(段对齐)——通知链接程序,逻辑段的目标代码在存储器中如何存放 BYTE——段从任意字节开始 WORD——段从下一个字地址开始开始 DWORD——段从下一个双字地址开始开始 PARA(默认)——段从下一节地址开始(16个字节为一节) PAGE——段从下一页地址开始(256字节为一页)
(2)链接参数(组合)——用于控制LINK行为,指示在满足定位方式的前提下,同名各模块如何组合(2)链接参数(组合)——用于控制LINK行为,指示在满足定位方式的前提下,同名各模块如何组合 PRIVATE(默认):段不与其他同名段合并。 PUBLIC——段与其它同名段合并为单个连续段 MEMORY——与PUBLIC等价 COMMON——段与其它同名段“覆盖”组合成一个逻辑段,段长为最长段长。 STACK——段与其它同名段组合成一个大堆栈段。 AT表达式——由表达式给出段基址。常与ORG伪指令配合,指定存储单元。 例:DATA SEGMENT AT 0040H ;DATA段的段基址为0040H ORG 0017H ;指定KEY的偏移地址 KEY DB ? ;KEY的物理地址为0417H DATA ENDS
图5.1(书P.80)指出主模块+子模块在链接时,链接参数的功能。图5.1(书P.80)指出主模块+子模块在链接时,链接参数的功能。 (3)’分类名’——用户指定,用来区别逻辑段 链接时,把不同模块中分类名相同的同名段组织成一类,存放在邻近的存储区中。 (4)段长度 USE16——该逻辑段长度最大允许为64K,单元的有效地址为16位,16位寻址方式 USE32——该逻辑段长度可以超过64K,单元的有效地址为32位,32位寻址方式,段长4G。
3.段约定语句 格式:ASSUME 段寄存器:段名,···,段寄存器:段名 功能:通知汇编程序,寻址逻辑段使用哪一个段寄存器,是非执行语句。 例:ASSUME CS:CODE,DS:DATA 说明: 作为代码段的第一条语句。 除CS以外段寄存器的初值必须在程序中用指令设置。如: MOV AX,DATA 或 MOV AX,SEG DATA MOV DS,AX MOV DS,AX DOS把一个可执行程序(EXE文件)调用内存之后,自动地把程序代码段的段基址赋给了CS。
4.过程定义语句 格式: 过程名 PROC 属性参数 …… 过程实体 …… RET 过程名 ENDP 属性参数: NEAR(可缺省):与调用指令在同一个代码段中。 FAR(远过程):与调用指令不在同一个代码段中。
5.定位语句 格式:ORG 表达式 功能:通知汇编程序,从表达式给出的有效地址开始,依次存放后继目标块。 例:CODE SEGMENT ASSUME CS:CODE ORG 100H BEG:JMP START ;有效地址BEG=100H BUF DB 12,34 START:····· ····· MOV AH,4CH INT 21H ;返回DOS CODE ENDS ;代码段结束 END BEG ;汇编程序结束
6.汇编结束语句 格式1:END 程序启动地址标号 例:END BEG ;表明以BEG标号开始的主程序的结束。 说明:DOS把一个可执行程序(EXE文件)调用内存之后,自动地把程序代码段的段基址赋给了CS,把BEG所在单元的偏移量赋给IP。 格式2:END ;用于模块化程序中的子模块结束。 程序返回DOS的常用方法: MOV AH,4CH INT 21H
第6章汇编语言程序设计 介绍基于DOS环境的实模式程序设计的基本方法。 本章主要教学内容 1、汇编语言基本格式、程序设计步骤和方法 2、DOS和BIOS中断调用 3、顺序、分支、循环、子程序的基本结构和设计方法 4、宏指令与条件汇编 本章教学目的 使学生掌握指令系统的应用,学会程序设计的方法。 教学重点:指令系统的应用、汇编语言程序设计 教学难点:指令的灵活运用、程序设计技巧
程序设计的基本步骤 (1)分析问题,抽象出数学模型 (2)确定算法或解题思想 (3)绘制流程图 (4)存储空间和工作单元初始化 (5)程序编制 (6)静态检查 (7)动态调试
程序的基本结构 程序一般可以由顺序结构、分支结构和循环结构这3种组合而成。每一个结构只有一个入口和一个出口,3种结构的任意组合和嵌套就构成了结构化的程序。 (1)顺序结构:是按照语句的先后次序执行一系列的顺序操作 (2)分支结构:也叫条件选择结构,根据不同情况做出判断和选择,以便执行不同的程序段,分为双分支结构和多分支结构。 (3)循环结构:循环实际上是分支结构的一种扩展,循环是否继续是依靠条件判断语句来完成的。按照条件判断的位置,可以把循环分为“当型循环”和“直到型循环”。
6.1 汇编源程序的编程格式 可执行文件的类型有: *.bat 批处理文件 低 *.exe 执行文件 (执行级别) *.com 执行文件 高 有两种类型的编程格式: 1、EXE文件的编程格式 2、COM文件的编程格式
6.1.1 EXE文件编程格式 .486 SSEG SEGMENT STACK 〈堆栈段的内容〉 SSEG ENDS DSEG SEGMENT 〈数据段的内容〉 DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,SS:SSEG 启动标号: 〈代码段的内容〉 MOV AH,4CH INT 21H ;返回DOS CSEG ENDS END启动标号 特点:可有多个逻辑段(数据段、堆栈段、代码段),在实模式下,每个逻辑段的目标块≤64KB,适合编写大型程序。
例6.1.1 :显示10行HELLO(.EXE格式) .486 DATA SEGMENT USE16 MESG DB ‘HELLO’,0DH,0AH,’$’ ;0DH:回车,0AH:换行 DATA ENDS STACK_ SEGMENT PARA STACK ‘STACK’ USE16 DB 100 DUP(?) STACK_ ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,SS:STACK_ BEG: MOV AX,STACK_ MOV SS,AX ;设置栈底和栈顶(可省略) MOV SP,100 ;∵装入内存时自动给SS,SP赋值。 MOV AX,DATA MOV DS,AX MOV CX,10 ;设置循环次数 LAST: MOV AH,9 MOV DX,OFFSET MESG INT 21H ;显示一行HELLO LOOP LAST ;循环控制 MOV AH,4CH INT 21H ;返回DOS CODE ENDS END BEG;结束 数据段 堆栈段 代码段
6.1.2 COM文件的编程格式 特点:(1)只有一个代码段,不允许设置堆栈段; (2)数据集中设置在代码段的开始或末尾; (3)在代码段偏移地址为100的单元必须是程序的启动指令。 (4)代码段的目标块﹤64KB。适合于编写中小型程序。 CODE SEGMENT USE16 ASSUME CS:CODE ORG 100H ;指定后继指令的有效地址 BEG:JMP START ;BEG为程序的启动地址 <数据定义> START: <代码内容> MOV AH,4CH 或采用INT 20H INT 21H ;返回DOS CODE ENDS END BEG
例6.1.2 :显示10行HELLO(.COM格式) CODE SEGMENT USE16 ASSUME CS:CODE ORG 100H ;指定后继指令的有效地址 BEG:JMP START ;BEG为程序的启动地址 MESG DB ‘HELLO’,0DH,0AH,’$’;0DH:回车,0AH:换行START: MOV CX,10 ;设置循环次数 LAST:MOV AH,9 MOV DX,OFFSET MESG INT 21H ;显示一行HELLO LOOP LAST ;循环控制 MOV AH,4CH 或采用INT 20H INT 21H ;返回DOS CODE ENDS END BEG;汇编结束
从汇编语言源程序到可执行程序的生成过程: (1)编辑生成ASM文件 (2)汇编生成OBJ文件(用TASM.EXE 或MASM.EXE) (3)链接生成EXE文件(用TLINK.EXE或LINK.EXE) (4)链接生成COM文件:用TLINK.EXE链接时使用小写的“t”做链接参数。 EDIT.EXE 编辑 TASM.EXE 汇编 目标程序.OBJ 汇编语言源程序.ASM TLINK.EXE 可执行程序.EXE 连接
6.1.3 EXE文件和COM文件的内存映像 • 1、当EXE文件装入内存: • 程序段前缀(PSP)——DOS在同一块内存区的用户程序上方(低址)偏移地址为00H~FFH的单元自动生成256个字节的数据块。 • 使DS=ES=存放PSP的段基址,FS=GS=0,使CS:IP=用户程序的启动地址,SS:SP指向用户堆栈段的栈顶,然后DOS将控制权交给用户。 • EXE文件内存映像如图6.1(a)(P.86)
DS,ES PSP CS:IP 用户程序 SS:SP 图6.1(a) EXE文件的内存映像
2、当COM文件装入内存: • 程序段前缀(PSP)——DOS在同一块内存区的用户程序上方(低址)偏移00H~FFH的单元生成一个程序段前缀。 • 从偏移地址100H开始依次存放用户程序,所以IP=100H,CPU从此开始执行。 • 自动为用户设置堆栈段,且在用户程序的高端。初始栈顶为2个字节的0。 • DOS自动赋值使CS=DS=ES=SS=PSP的段基址。FS=GS=0,IP=100H,SP=FFFEH,后DOS将控制权交给用户。 • COM文件内存映像如图6.1(b)(P.86)
CS,DS,ES,SS PSP 100H IP 64KB—256B SP 图6.1(b) COM文件的内存映像
6.1.4 程序段前缀(PSP) • 占用256个单元,信息是DOS装载可执行文件时自动生成的,用来管理用户程序: • 向用户程序传递参数,提供正常结束和异常结束时返回DOS的途径。 • PSP的数据格式:(书P.86 ) • 程序运行时如何从PSP中获取命令行参数? • 当程序结束返回DOS之后,用户程序及PSP所占用的内存空间均被释放。
6.1.5 返回DOS的其他方法 1、常用方法:MOV AH,4CH INT 21H 2、COM文件还有3种: (1)直接执行 INT 20H; (2)调用 INT 21H 的0号功能; MOV AH,0 INT 21H (3)执行RET指令。 如果堆栈段的内容全部弹出,则SP必然等于FFFEH,CPU将无条件转入PSP的首单元,执行那里的INT 20H,返回DOS。
3、EXE文件还有1种:设法使CPU转到PSP首单元 采用下面3项措施: (1)把整个执行程序放在一个远过程中 (2)在给DS赋初值之前,将PSP的物理地址入栈,执行: PUSH DS MOV AX,0 PUSH AX (3)程序在需要返回DOS的地方执行RET指令即可,此时CS:IP为PSP的首单元 例6.1.3 :显示10行HELLO(.EXE格式)
例6.1.3 :显示10行HELLO(.EXE格式) .486 DATA SEGMENT USE16 MESG DB ‘HELLO’,0DH,0AH,’$’ ;0DH:回车,0AH:换行 DATA ENDS STACK_ SEGMENT PARA STACK ‘STACK’ USE16 DB 100 DUP(?) STACK_ ENDS CODE SEGMENT USE16 ASSUME CS:CODE,DS:DATA,SS:STACK_ MAIN PROC FAR ;定义远过程 BEG: PUSH DS MOV AX,0 ;PSP首单元物理地址入栈 PUSH AX MOV AX,DATA MOV DS,AX MOV CX,10 ;设置循环次数 LAST: MOV AH,9 MOV DX,OFFSET MESG INT 21H ;显示一行HELLO LOOP LAST ;循环控制 RET;返回DOS MAIN ENDP CODE ENDS END BEG;结束 远过程
6.1.6 源程序堆栈段的设置 COM文件:不允许设置堆栈区,但其装入内存后,DOS将自动在用户程序的高端地址为其设置堆栈区。 EXE文件:可以设置SS,若没有设置链接时有警告信息,但DOS将其装入内存后,自动分配128个字节的堆栈区。
6.2 DOS系统I/O功能调用(INT 21H) DOS系统中有两个核心模块: IBMBIO.COM——为基本I/O设备处理程序,完成数据I/O的基本操作。 IBMDOS.COM——磁盘文件管理程序。 这两个模块中有100多个子功能可被用户调用。用户调用这些子功能就称之为“DOS系统功能调用”。 DOS系统功能调用的调用模式: MOV AH,功能号 设置入口参数 INT 21H ;执行“21型中断服务程序”的由AH指定的子程序。 分析出口参数
DOS系统常用的输入/输出功能调用 1、从键盘输入一个字符 (1)01H功能——等待键盘键入一个字符,有回显,响应Ctrl_C。 (2)08H功能——等待键盘键入一个字符,无回显,响应Ctrl_C。 (3)07H功能——等待键盘键入一个字符,无回显,不响应Ctrl_C。 入口参数:无 出口参数:AL=按键的ASCII码。 若AL=0,表明按键是功能键,需再次调用本功能,才能返回按键的扩展码。 例:MOV AH,01H INT 21H CMP AL,‘Y’ ;从键盘输入的字符与‘Y’比较 JE EXIT ;若是,转
2、在屏幕上显示一个字符 02H功能——在光标所在位置显示一个字符,光标右移,响应Ctrl_C。 入口参数:DL=待显示的ASCII码。 出口参数:无 例:MOV AH,02H MOV DL,‘A’ INT 21H ;在屏幕上显示字符A
3、判断有无键盘输入 06H功能——根据DL寄存器的内容执行字符显示/字符输出 (1)显示DL中的字符 入口参数:DL=0~FEH 出口参数:无,显示与DL内容对应的字符 (2)判断有无键盘输入,无回显,不响应Ctrl_C。 入口参数:DL=FFH 出口参数:若无键输入,则置Z标=1 若有键输入,则置Z标=0,AL=输入字符的ASCII码。若AL=0,需再次调用本功能,才能返回按键的扩展码。 0BH功能——查询有无键盘输入,响应Ctrl+C 入口参数:无 出口参数:AL=0 无键入 AL=FFH 有键入
3、在屏幕上显示字符串 09H功能——从当前光标处开始显示字符直到遇到串的结束标志,‘$’(即ASCII码24H),响应Ctrl+C。 入口参数:DS:DX=字符串首地址。 出口参数:无。实验证明破坏AL寄存器的内容。 例:设数据段 STR DB ‘AAAAA’,0DH,0AH,‘$’ 代码段 对DS初始化 MOV AH,09H MOV DX,OFFSET STR INT 21H ;屏幕上显示‘AAAAA’并回车换行 ·····