1 / 85

《 微机原理与接口技术 》 第五章、第六章

《 微机原理与接口技术 》 第五章、第六章. 主讲:方义秋. 第 5 章 宏汇编语言 本章学习目标 通过本章的学习,应当掌握以下内容: • 了解汇编语言的基本知识和特点。 掌握宏汇编基本语法。 • 掌握汇编语言常用伪指令的使用方法。 • 熟悉宏汇编语言的程序结构、段定义以及语句的格式。. 汇编语言与宏汇编语言. 汇编语言 是一种面向 CPU 指令系统的程序设计语言,它采用指令助记符来表示操作码和操作数,用符号地址表示操作数地址。

denim
Download Presentation

《 微机原理与接口技术 》 第五章、第六章

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 《微机原理与接口技术》第五章、第六章 主讲:方义秋

  2. 第5章 宏汇编语言 • 本章学习目标 • 通过本章的学习,应当掌握以下内容: • •了解汇编语言的基本知识和特点。 • 掌握宏汇编基本语法。 • •掌握汇编语言常用伪指令的使用方法。 • •熟悉宏汇编语言的程序结构、段定义以及语句的格式。

  3. 汇编语言与宏汇编语言 • 汇编语言是一种面向CPU指令系统的程序设计语言,它采用指令助记符来表示操作码和操作数,用符号地址表示操作数地址。 • 汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。 • 汇编程序是最早也是最成熟的一种系统软件,它除了能够将汇编语言源程序翻译成机器语言程序这一主要功能外,还能够根据用户的要求自动分配存储区域,包括程序区、数据区、暂存区等;自动把各种进制数转换成二进制数,把字符转换成ASCII码,计算表达式的值等;自动对源程序进行检查,给出错误信息,如非法格式、未定义的助记符、标号、漏掉操作数等。具有这些功能的汇编程序称为基本汇编ASM(Assembler)。

  4. 在基本汇编的基础上,进一步允许在源程序中把一个指令序列定义为一条宏指令,并包含有大量伪指令的汇编程序,叫做宏汇编MASM(MacroAssembler)。它包含全部基本汇编ASM的功能,还增加了宏指令、结构、记录等高级汇编语言功能。在基本汇编的基础上,进一步允许在源程序中把一个指令序列定义为一条宏指令,并包含有大量伪指令的汇编程序,叫做宏汇编MASM(MacroAssembler)。它包含全部基本汇编ASM的功能,还增加了宏指令、结构、记录等高级汇编语言功能。

  5. 5.1 汇编程序的语句类型 1.汇编程序采用分段结构,每一段有若干语句组成。 2.语句分类: 指令性语句,即符号指令——通知CPU进行某种操作的命令,由硬件完成其功能。 指示性语句,即伪指令——提供编译信息、链接信息,其功能由相应的软件完成。 3.符号指令的书写格式: [标号:] 符号指令 [;注释] 4.伪指令的书写格式: [变量名] 伪指令 [;注释] 注:版本不同,伪指令的种类也略有不同。

  6. 5.2 宏汇编基本语法 5.2.1 标号、变量和常量 1.标号和变量——又称符号地址 标号——代表指令地址,定义在代码段,为转移指令提供目标。 变量——代表内存操作数的存储地址,或者说变量名就代表某个单元。定义在DS,ES,FS,GS,SS段。 命名规则:不能用保留字、仅能使用给定集合的符号、不能用数字打头、最长不超过31个字符。

  7. 标号和变量的3个属性 段属性:其所在的段基址,用SEG运算符可算出。 例:MOV AX,SEG BUF 偏移属性:用OFFSET运算符可算出其有效地址。 例:MOV BX,OFFSET BUF 类型属性: 变量的类型有: 字节型:用DB伪指令定义 字型: 用DW伪指令定义 双字型:用DD伪指令定义 四字型:用DQ伪指令定义 五字型:用DT伪指令定义 注:使用时,可用PTR运算符作临时性的修改 标号的类型有: NEAR(近):该类型标号是段内转移指令的目标地址 FAR(远):该类型标号是其他代码段转移指令的目标地址

  8. 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

  9. 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

  10. (3)关系运算符有: 注:关系运算符为“真”时,结果为“-1”(即全1),否则为0。

  11. 2.修改类型属性的运算符——PTR运算符 格式: 类型的说明符 PTR 地址表达式 类型说明符有: BYTE(字节) WORD(字) PTR 内存操作数的5种寻址之一 DWORD(双字) NEAR(近) FAR(远) PTR 转移地址标号/过程名

  12. 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的偏移基址

  13. (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

  14. 4.方括号运算符和地址表达式 [地址表达式]——是内存操作数的常用寻址方式。 [下标]——表示用下标访问数据元素,直接寻址. 例: XYZ DW 1234H,5678H MOV BX, XYZ[2] ;BX=78H

  15. 5.3 数据定义的伪指令 1.等值伪指令 格式: 符号常数 EQU 表达式 例:XX EQU 22H ;XX代表22H 特点:符号常数在后继语句中不能更改。 2.等号伪指令 格式: 符号常数 = 表达式 例:XX = 22H ;XX代表22H, 特点:在后继语句中可以重新定义: XX=XX+1 注:符号常数可定义在任意逻辑段中,要先定义后使用。

  16. 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单元。

  17. 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)

  18. 5.4 宏汇编语言基本语法 本节主要解决程序的结构: 说明CPU的类型 定义逻辑段结构 说明段约定 定义过程 返回DOS系统 说明程序的结束

  19. 1.方式选择伪指令指明使用的CPU类型 格式及功能: .8086 ;只汇编8086、8088指令 .486 ;80486及以下实模式指令 .486P ;80486及以下全部指令 缺省 ;与设置.8086等价 位于源程序的第一条指令。

  20. 2.段定义语句——即逻辑段的定界语句 格式: 段名 SEGMENT 定位参数 链接参数 ‘分类名’ 段长度 段体 称为属性参数(可选) 段名 ENDS 属性参数为源程序的汇编、链接提供必要的信息,用于模块化设计: 各模块单独编译,单独汇编,生成各自的OBJ文件,然后通过链接程序将各OBJ文件链接起来,生成一个EXE文件。 不同模块之间,同名段如何链接、如何定位?

  21. (1)定位参数(段对齐)——通知链接程序,逻辑段的目标代码在存储器中如何存放(1)定位参数(段对齐)——通知链接程序,逻辑段的目标代码在存储器中如何存放 BYTE——段从任意字节开始 WORD——段从下一个字地址开始开始 DWORD——段从下一个双字地址开始开始 PARA(默认)——段从下一节地址开始(16个字节为一节) PAGE——段从下一页地址开始(256字节为一页)

  22. (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

  23. 图5.1(书P.80)指出主模块+子模块在链接时,链接参数的功能。图5.1(书P.80)指出主模块+子模块在链接时,链接参数的功能。 (3)’分类名’——用户指定,用来区别逻辑段 链接时,把不同模块中分类名相同的同名段组织成一类,存放在邻近的存储区中。 (4)段长度 USE16——该逻辑段长度最大允许为64K,单元的有效地址为16位,16位寻址方式 USE32——该逻辑段长度可以超过64K,单元的有效地址为32位,32位寻址方式,段长4G。

  24. 3.段约定语句 格式:ASSUME 段寄存器:段名,···,段寄存器:段名 功能:通知汇编程序,寻址逻辑段使用哪一个段寄存器,是非执行语句。 例:ASSUME CS:CODE,DS:DATA 说明: 作为代码段的第一条语句。 除CS以外段寄存器的初值必须在程序中用指令设置。如: MOV AX,DATA 或 MOV AX,SEG DATA MOV DS,AX MOV DS,AX DOS把一个可执行程序(EXE文件)调用内存之后,自动地把程序代码段的段基址赋给了CS。

  25. 4.过程定义语句 格式: 过程名 PROC 属性参数 …… 过程实体 …… RET 过程名 ENDP 属性参数: NEAR(可缺省):与调用指令在同一个代码段中。 FAR(远过程):与调用指令不在同一个代码段中。

  26. 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 ;汇编程序结束

  27. 6.汇编结束语句 格式1:END 程序启动地址标号 例:END BEG ;表明以BEG标号开始的主程序的结束。 说明:DOS把一个可执行程序(EXE文件)调用内存之后,自动地把程序代码段的段基址赋给了CS,把BEG所在单元的偏移量赋给IP。 格式2:END ;用于模块化程序中的子模块结束。 程序返回DOS的常用方法: MOV AH,4CH INT 21H

  28. 第6章汇编语言程序设计 介绍基于DOS环境的实模式程序设计的基本方法。 本章主要教学内容 1、汇编语言基本格式、程序设计步骤和方法 2、DOS和BIOS中断调用 3、顺序、分支、循环、子程序的基本结构和设计方法 4、宏指令与条件汇编 本章教学目的 使学生掌握指令系统的应用,学会程序设计的方法。 教学重点:指令系统的应用、汇编语言程序设计 教学难点:指令的灵活运用、程序设计技巧

  29. 程序设计的基本步骤 (1)分析问题,抽象出数学模型 (2)确定算法或解题思想 (3)绘制流程图 (4)存储空间和工作单元初始化 (5)程序编制 (6)静态检查 (7)动态调试

  30. 程序的基本结构 程序一般可以由顺序结构、分支结构和循环结构这3种组合而成。每一个结构只有一个入口和一个出口,3种结构的任意组合和嵌套就构成了结构化的程序。 (1)顺序结构:是按照语句的先后次序执行一系列的顺序操作 (2)分支结构:也叫条件选择结构,根据不同情况做出判断和选择,以便执行不同的程序段,分为双分支结构和多分支结构。 (3)循环结构:循环实际上是分支结构的一种扩展,循环是否继续是依靠条件判断语句来完成的。按照条件判断的位置,可以把循环分为“当型循环”和“直到型循环”。

  31. 6.1 汇编源程序的编程格式 可执行文件的类型有: *.bat 批处理文件 低 *.exe 执行文件 (执行级别) *.com 执行文件 高 有两种类型的编程格式: 1、EXE文件的编程格式 2、COM文件的编程格式

  32. 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,适合编写大型程序。

  33. 例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;结束 数据段 堆栈段 代码段

  34. 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

  35. 例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;汇编结束

  36. 从汇编语言源程序到可执行程序的生成过程: (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 连接

  37. 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)

  38. DS,ES PSP CS:IP 用户程序 SS:SP 图6.1(a) EXE文件的内存映像

  39. 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)

  40. CS,DS,ES,SS PSP 100H IP 64KB—256B SP 图6.1(b) COM文件的内存映像

  41. 6.1.4 程序段前缀(PSP) • 占用256个单元,信息是DOS装载可执行文件时自动生成的,用来管理用户程序: • 向用户程序传递参数,提供正常结束和异常结束时返回DOS的途径。 • PSP的数据格式:(书P.86 ) • 程序运行时如何从PSP中获取命令行参数? • 当程序结束返回DOS之后,用户程序及PSP所占用的内存空间均被释放。

  42. 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。

  43. 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格式)

  44. 例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;结束 远过程

  45. 6.1.6 源程序堆栈段的设置 COM文件:不允许设置堆栈区,但其装入内存后,DOS将自动在用户程序的高端地址为其设置堆栈区。 EXE文件:可以设置SS,若没有设置链接时有警告信息,但DOS将其装入内存后,自动分配128个字节的堆栈区。

  46. 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指定的子程序。 分析出口参数

  47. 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 ;若是,转

  48. 2、在屏幕上显示一个字符 02H功能——在光标所在位置显示一个字符,光标右移,响应Ctrl_C。 入口参数:DL=待显示的ASCII码。 出口参数:无 例:MOV AH,02H MOV DL,‘A’ INT 21H ;在屏幕上显示字符A

  49. 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 有键入

  50. 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’并回车换行 ·····

More Related