890 likes | 1.05k Views
微型计算机系统. 第三章:汇编语言程序设计. 教学提示: 汇编语言程序设计是开发微机系统软件的基本功,在程序设计中具有十分重要的地位。在该章中我们将介绍汇编语言的基本概念、基本语法规则和语句结构,以及汇编语言程序设计的基本方法。. 教学要求: 掌握汇编语言的程序设计方法。汇编语言主要用于帮助我们深入地了解计算机的体系结构;编制控制硬件的底层程序。对于本章中出现的基础程序,必须熟练地掌握;对于本章中出现的偏向高层应用的程序,则要进行必要的了解。. 本章主要内容 :. 3.1 汇编语言语句 3.2 伪指令 3.3 宏指令
E N D
第三章:汇编语言程序设计 教学提示: 汇编语言程序设计是开发微机系统软件的基本功,在程序设计中具有十分重要的地位。在该章中我们将介绍汇编语言的基本概念、基本语法规则和语句结构,以及汇编语言程序设计的基本方法。 教学要求: 掌握汇编语言的程序设计方法。汇编语言主要用于帮助我们深入地了解计算机的体系结构;编制控制硬件的底层程序。对于本章中出现的基础程序,必须熟练地掌握;对于本章中出现的偏向高层应用的程序,则要进行必要的了解。 Company Logo
本章主要内容: 3.1 汇编语言语句 3.2 伪指令 3.3 宏指令 3.4 常用的DOS与BIOS中断功能调用 3.5 顺序程序设计 3.6 分支程序设计 3.7 循环程序设计 3.8 子程序设计 Company Logo
第三章:汇编语言程序设计 §3.1 汇编语言语句 一、机器语言、汇编语言和高级语言 机器语言:用0、1代码表示的机器指令形式,是机器硬件唯一能识别和执行的语言。 例:机器指令0100 0000;表示(AX)+1→AX 汇编语言 :用符号表示指令的操作码、操作数。又称符号语言。 例:INC AX ;增1指令 Company Logo
第三章:汇编语言程序设计 • 汇编语言和机器语言都是面向机器的语言,即不同的机器有不同的指令系统。 • 汇编指令与机器代码是一一对应的。 • 汇编语言、机器语言均属于低级语言。 高级语言: 接近人的自然语言和数学表达式。用高级语言编写的程序是脱离机器的、面向过程或面向对象的语言。如:C语言,Java语言等。 Company Logo
第三章:汇编语言程序设计 二、汇编语言的特点 • 代码长度短,执行速度最快 • 可直接有效的控制机器的运行 • 准确掌握机器运行时间 • 可最有效的利用CPU、内存、I/O资源 直接控制机器运行的场合 汇编语言常用于: 需要准确控制运行时间的场合 运行速度要求很高的场合 Company Logo
第三章:汇编语言程序设计 三、语句的类别与结构 1. 汇编语句的类别 指令语句: 由汇编程序汇编成相应的能被CPU直接识别并执行的目的码,或称机器代码。 宏指令语句: 允许用户为多次重复使用的程序段命名的一个名字。包括指令语句和伪指令语句,即将一个程序段定义为一宏指令。 Company Logo
第三章:汇编语言程序设计 伪指令语句: 伪指令语句是一种指示性语句,这类语句向汇编程序提供汇编过程要求的一些辅助信息,如给变量分配内存单元地址、定义各种符号、实现分段等。 • 伪指令与指令性语句的区别: • 伪指令语句经汇编后不产生任何机器代码,而指令性语句经汇编后会产生相应的机器代码; • 伪指令语句所指示的操作是在程序汇编时就完成了的,而指令性语句的操作必须在程序运行时才能完成。 Company Logo
第三章:汇编语言程序设计 2、汇编语言的语句格式 [名字项] 操作项 [操作数] [;注释项] 操作项:指明操作的性质,说明计算机要执行的具体操作。 用助记符表示。可以是指令、宏指令语句、伪指 令的助记符。 操作数:指明指令执行过程中所需的数据。可有0个、1个 或者多个表达式组成,并由它提供执行指定操作 所需要的操作数或地址。 Company Logo
第三章:汇编语言程序设计 注释项:必须以分号开头,主要用来说明程序或重要语句的 功能。 名字项:是用标识符表示的符号 在指令和宏指令中,称为标号。且对应的标识符后面必须跟有冒号,标号在汇编以后分配有地址。标号又称为符号地址,可作为转移指令或子程序调用的目标地址。 若名字项出现在伪指令语句前,则该名字项称为符号名,根据不同的伪指令,这些符号名又可分为变量名、符号常数名、子程序名或段名等。 Company Logo
第三章:汇编语言程序设计 名字项的书写规定,可使用下列字符: 字母:A~Z,a~z 数字:0~9 特殊字符:?、@、$等。 名字不能使用汇编语言的专用保留字、寄存器名、汇编语言中的指令助记符等。 名字最多由31个字符组成,打头的必须是字母、?、@、-,不能是数字。 Company Logo
第三章:汇编语言程序设计 四、指令语句的操作数 操作数项的常见形式有:常数、寄存器、标号、变量或表达式。 常数:常数分为数值常数、字符串常数和符号常数。 数字常数:若数的最高位以字母A~F开头,则必须在它前面加一个0。 字符串常数:是指用单引号括起来的一个字符或多个字符的序列。 如:MOV AH,`B`指令和MOV AH,42H是等价的。 符号常数:数据段中用EQU伪指令或“=”伪指令定义的 Company Logo
第三章:汇编语言程序设计 变量:变量是一个数据存储单元的名字,即数据存放地址 的符号表示。定义变量实际上就是给变量分配内存 单元。 如:ARRAYT DW 1,0,3,49 变量有3种属性:段属性、偏移属性和类型属性 段属性表示变量所在段的起始地址。 偏移属性表示变量在段内的偏移地址。用16位无符号表示偏移地址。 类型属性表示该变量能存放的数据长度。长度为1B的变量,类型为 ,长度为2B的变量,类型为 等。 WORD BYTE Company Logo
第三章:汇编语言程序设计 标号:在指令语句前面,后面跟冒号(:) ,表示指令的符 号地址,指示汇编后该指令代码在内存中的位置。 它也有3种属性:段属性、偏移属性和类型属性。 • 段属性表示该标号的段起始地址,该地址一定在CS段中 • 偏移属性表示标号在代码段中的段内偏移地址。是一个16位的无符号数。 类型属性表示该标号是在本段内引用,还是在其它段中引用。在段内引用的标号为NEAR属性,在段外引用的标号为FAR属性。 Company Logo
第三章:汇编语言程序设计 表达式:由常数、变量、标号通过运算符或操作符连接而成 的,可分为数值表达式和地址表达式。 数值表达式:由算术运算符、关系运算符和逻辑运算符连接常数组成的有意义的式子,它的运算结果是数值常数,只有大小,没有属性。 • 地址表达式:由变量、标号、常数、寄存器(BP、BX、SI、DI)的内容和操作符组成的有意义的式子,它的运算结果不是一个普通的数值,总是和存储器地址相联系。如各种存储器寻址方式的汇编表示都属于简单的地址表达式 Company Logo
第三章:汇编语言程序设计 五、指令语句中的运算符和操作符 数值表达式中进行算术运算的符号称运算符,地址表达式中的运算符称为操作符。 1、运算符 算术运算符有+、―、*、/、MOD、右移SHR和左移SHL运算符。要求参加运算的数(或地址)均为整数,运算的结果也为整数,除法运算的结果是商的整数部分。 逻辑运算符依次为NOT、AND、OR和XOR。按位进行操作,其结果为整数常量。 Company Logo
第三章:汇编语言程序设计 关系运算符有6种,它们分别是: EQ相等(Equal) NE 不等(Not Equal) LT 小于(Less) LE 小于或等于(Less or Equal) GT 大于(Greater) GE 大于或等于(Greater or Equal) 用于两个表达式值的比较,表达式的值一定是常数或是同一段内的偏移地址,比较的结果为逻辑值,关系成立,结果为真,用全“1”表示;关系不成立,结果为假,用全“0”表示 Company Logo
第三章:汇编语言程序设计 2. 操作符 1) 数值回送操作符(5个) OFFSET——取偏移地址操作符 格式:OFFSET 变量或标号 功能:返回该变量或标号在其段内的偏移地址。 例:MOV SI,OFFSET BUF ;将BUF在数据段内的偏移地址作为立即数送到SI中。 等效于指令 : LEA SI,BUF SEG——取段址操作符。 格式:SEG 变量或标号 功能:返回变量或标号所在段的段基址。 例: MOV AX,SEG BUF Company Logo
第三章:汇编语言程序设计 TYPE——取类型操作符 格式:TYPE 变量或标号 功能:当TYPE置于变量前面时,返回变量的类型数字。 即DB为1,DW为2,DD为4,DQ为8,DT为10。 当TYPE置于标号前面时,返回标号的类型属性值;当该 标号为NEAR属性时,返回值为-1,标号为FAR属性时, 返回值为-2。 例:数据段中有如下定义:DATA DW 75H,134H。 执行:ADD SI,TYPE DATA。 该语句在汇编后相当于指令ADD SI,2。 Company Logo
第三章:汇编语言程序设计 LENGTH——取变量所含的数据个数操作符 格式:LENGTH 变量 功能:只对变量起作用,取值根据定义该变量时数据定义伪指令后面第一个表达式的形式而定。如为重复子句“n DUP(表达式)”,返回外层重复因子n,其它形式的表达式,则返回1。 例: DATA SEGMENT A1 DB ‘ABCD’,5 DUP(0) A2 DB 10 DUP(1),1234H A3 DW 10,20 DUP(?) A4 DW 5 DUP(3 DUP(2),5) DATA ENDS ┆ 汇编后相当于指令: MOV AL,1 MOV CX,10 MOV BX,1 MOV DX,5 MOV AL,LENGTH A1 MOV CX,LENGTH A2 MOV BX, LENGTH A3 MOV DX,LENGTH A4 Company Logo
第三章:汇编语言程序设计 SIZE——取变量所含的数据存储区大小操作符 格式:SIZE 变量 功能:汇编程序用该操作符返回的值表示该变量所分配的总字 节数。 SIZE=LENGTH×TYPE 例:A2 DW 10 DUP(1),1234H MOV CX,SIZE A2 汇编后相当于有指令: MOV CX, 14H Company Logo
第三章:汇编语言程序设计 2) 属性修改操作符 属性修改操作符主要用于临时修改变量、标号或某个内存单元中的操作数的类型属性,它们共有5种(看书)。 PTR——属性定义操作符 格式:类型 PTR 地址表达式 功能:PTR操作符的作用是将地址表达式的原类型属性临时修改成PTR操作符前面所指定的类型。指定的类型可以是BYTE、WORD或DWORD。 例:MOVBYTE PTR [SI], 20H;占一个字节 或 MOVWORD PTR [SI], 20H ;占两个字节 Company Logo
第三章:汇编语言程序设计 运算符的优先顺序 Company Logo
第三章:汇编语言程序设计 §3.2 伪指令 伪指令又称伪操作,它不像机器指令那样是在程序运行期间由计算机来执行的,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如数据定义、分配存储区、指示程序结束等功能。 §3.2.1 数据定义与符号定义伪指令 1. 数据定义伪指令 格式:[变量名] 数据定义伪指令 操作数项表 功能:定义数据存储区,其类型由伪指令指定。 Company Logo
第三章:汇编语言程序设计 • 数据定义伪指令常用的有以下五种: • [变量名] DB 操作数项表;定义字节 • [变量名] DW 操作数项表;定义字 • [变量名] DD 操作数项表;定义双字 • [变量名] DQ 操作数项表;定义8个字节 • [变量名] DT 操作数项表;定义10个字节 操作数项表可以是常数或表达式、字符串、?和带DUP的表达式。 Company Logo
给变量赋初值或指定变量类型 例:COUNT DB 100 ARRAY DW -1,1024 64H 100 -1 1024 存储形式:COUNT→ ARRAY→ FFH FFH 00H 04H 第三章:汇编语言程序设计 Company Logo
STR: 41H STR1: 42H 42H 41H 43H 44H 定义一个ASCⅡ码的字符串 第三章:汇编语言程序设计 为字符串的每个字符分配一个存储单元,并从左到右 将字符的ASCⅡ码按地址递增顺序存放在内存中。 例1: STR DB ‘ABCD’ 例2: STR1 DW ‘AB’ Company Logo
? SUB1: ? RESU: ? 第三章:汇编语言程序设计 • 用?号预留内存单元 • 例: SUB1 DB ? ;预留一个字节单元 • RESU DW ? ;预留二个字节单元 Company Logo
00 DA1 00 41 DA2 42 41 42 01 DA3 00 01 00 例1: DA1 DB 2 DUP(0) DA2 DB 2 DUP(‘AB’) DA3 DW 2 DUP(1) 第三章:汇编语言程序设计 • 用DUP重复因子初始化一个数据区 • 格式:N DUP (表达式) ?、数值、 数值表达式 字符等 重复次数重复装入的内容 例2:DUP的嵌套使用DATA DB 10 DUP(10 DUP(0))定义了100个字节全部初始化为0。 Company Logo
第三章:汇编语言程序设计 2. 符号定义伪指令 EQU——赋值伪指令 格式:变量名 EQU 表达式 功能:将右边表达式的值赋给左边的变量。表达式可以是常 数、变量、标号、指令助记符、数值表达式、地址表达 式。 例:PORT1 EQU 100 ;符号PORT1代表常数100 CONT EQU CX ;为CX重新命名 ABDR EQU PORT1+1 ABC EQU DAA 注:同一程序中,不能重复定义 Company Logo
第三章:汇编语言程序设计 =——等号伪指令 格式:符号名 = 表达式 功能:与EQU基本相同,两者的区别在于“=”伪指令可对同 一标识符作重新定义。 例:EMP = 12 ;定义EMP等于12 EMP = EMP+1 可以对同一个符号名重复定义。 Company Logo
第三章:汇编语言程序设计 § 3.2.2 段定义伪指令 1. 段定义伪指令 存储器的物理地址是由段地址和偏移地址组合而成的,而存储器又可以为多个段,汇编程序是按段来组织程序和使用存储器,在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用到段定义伪指令。 格式如下: 段名 SEGMENT [定位类型] [组合类型][‘类别’] … 段名ENDS Company Logo
第三章:汇编语言程序设计 一般情况下,定位类型、组合类型和类别说明可以不用。但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要使用这些说明。 注意:SEGMENT和ENDS语句必须成对使用。 例:定义一数据段DATA DATA SEGMENT A DB '1234' B DW 12H DATA ENDS Company Logo
第三章:汇编语言程序设计 2. 指定段址伪指令 格式:ASSUME 段寄存器:段名[,段寄存器:段名,...] 功能:指明段和段寄存器的对应关系,且段名必须是由 SEGMENT定义的段名。 注意:ASSUME伪指令只是指明段和段寄存器的对应关系,并没有把段地址装入段寄存器中。但是,代码段段寄存器CS的值是由系统负责设置的。 Company Logo
第三章:汇编语言程序设计 例:DATA SEGMENT X DB 12H DATA ENDS STACK SEGMENT DW 100 DUP(?) STACK ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX ┆ CODE ENDS END START Company Logo
第三章:汇编语言程序设计 § 3.2.3 模块定义伪指令 1. 模块定义伪指令NAME/END(程序开始与结束语句) 格式:NAME 模块名 … END 标号 功能:由NAME和END定义一个程序模块。标号为模块执行时 的起始地址。 说明:① 如果程序中没有NAME伪指令,则将用源程序文件名 作为模块名。 ② 标号指示程序开始执行的起始地址的标号。 Company Logo
第三章:汇编语言程序设计 NAME ABSOLT DATA SEGMENT OPER1 DW 12 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX ┆ HLT CODE ENDS END START Company Logo
第三章:汇编语言程序设计 § 3.2.4 过程定义伪指令 格式为:过程名 PROC [NEAR/FAR] … RET 过程名 ENDP 功能:过程定义伪指令用于定义子程序。段内调用使用NEAR 属性,段间调用使用FAR属性。省略为NEAR。 Company Logo
第三章:汇编语言程序设计 CODE SEGMENT COUNT PROC NEAR ADD CX,1 RET COUNTENDP START:MOV AX,100 ┊ CALL COUNT ┊ CALL COUNT ┊ HLT CODE ENDS END START 子程序: COUNT PROCE ┆ ┆ RET Company Logo
12H DS: 0100 0101 0102 0103 0104 0105 0106 0107 ? ? 22H 11H 00 00 第三章:汇编语言程序设计 § 3.2.5 其他伪指令 1. ORG伪指令 格式:ORG 数值表达式。 功能:指定在它之后的程序段或数据块所存放的起始地址的 偏移量。 • 无ORG语句时,段偏移地址从0000H开始。 例1. DATA SEGMENT ORG 100H X DB 12H Y DW ? Z DD 1122H DATA ENDS • $-表示汇编地址计数器的当前值 $ Company Logo
第三章:汇编语言程序设计 利用$-变量名,动态确定数据区字节 例2. DATA SEGMENT DA1 DB 1,2,3,4 DA2 DW 4 DUP(?) COUNT EQU $-DA1 ; DATA ENDS Count=? 12-0→COUNT Company Logo
第三章:汇编语言程序设计 § 3.2.6 汇编语言源程序的结构 一般格式如下: NAME 模块名(可有可无) 数据段名SEGMENT 变量定义 数据空间预置 数据段名ENDS 附加段名SEGMENT 变量定义 数据空间预置 附加段名ENDS 堆栈段名SEGMENT PARA STACK ‘STACK’ 堆栈段空间预置 堆栈段名ENDS 代码段名SEGMENT ASSUME CS:代码段名,DS:数据段名,ES:附加段名,SS:堆栈段名 Start: 指令1 指令2 … 指令n 代码段名ENDS END start Company Logo
§3.3 宏指令 第三章:汇编语言程序设计 • 宏定义: 格式: 宏指令名 MACRO [形式参数表] ┆ ┆ ENDM • 宏调用: 格式: 宏指令名 [实际参数,…] 宏指令——源程序中一个能多次可重复使用的具有独立功能 的代码段。 1、宏指令的定义和使用 宏指令的使用过程有宏定义、宏调用、宏展开。 宏指令体 Company Logo
第三章:汇编语言程序设计 例:完成AX的内容乘以2X的宏定义及宏调用 定义宏:MULX MACRO PX 形式参数 宏指令名 MOV CL,PX SAL AX,CL ENDM 实际参数 宏调用: ┆ MULX 2 ; ┆ MULX 4 ; ┆ MULX 5 ; AX←(AX)*22 AX←(AX)*24 AX←(AX)*25 Company Logo
第三章:汇编语言程序设计 宏调用: ┆ ┆ MULT 120,BL,SAVE ┆ 宏展开:在汇编宏指令时,宏汇编程序将宏指令体插入到宏指 令所在的位置,并用实际参数代替形式参数。 例:两数相乘,返回积。 宏定义:MULT MACRO OPR1,OPR2,RESULT MOV AL,OPR1 IMUL OPR2 MOV RESULT,AX ENDM MOV AL,120 IMUL BL MOV SAVE,AX Company Logo
第三章:汇编语言程序设计 § 3.4 常用的DOS与BIOS中断功能调用 §3.4.1 DOS中断与系统功能调用 1. DOS中断 DOS除了给用户提供了命令行服务以外,还为汇编语言程序员提供了大量的子程序,这些子程序包含了从基本输入输出到内存管理、磁盘读写、文件系统等各个方面,使用这些子程序,使得汇编语言程序员不必搞清大量的设备接口、数据结构等细节,即可完成所需功能,简化了汇编语言的编程。由于DOS提供的这些子程序被看作是DOS系统功能的一部分,因而人们把对这些子程序的调用又称为DOS功能调用。 Company Logo
第三章:汇编语言程序设计 DOS提供的这些子程序位于DOS的基本系统文件IBMBIO.COM和IBMDOS.COM中,随着DOS的加载而进入内存,即只要能启动DOS就可以使用。DOS的这些子程序是以中断的方式向系统及应用程序提供服务的,故必须采用软中断指令INT进行调用。 随着DOS的发展,所提供的功能(子程序)越来越多,不可能每一个子程序都占用一个中断号,于是采用让它们共用一个中断号,即21H号的办法,进入这一个中断后,DOS再根据应用户程序中子程序编号的设置来确定用户程序到底想调用哪一个子功能。 Company Logo
第三章:汇编语言程序设计 • 2. DOS系统功能调用 • DOS功能调用的方法 • 调置入口参数,如果所调用的子程序不需参数,则可省略此步。 • 欲调用的子程序编号→AH。 • 发中断调用指令INT 21H。 • DOS基本I/O功能调用 • 01功能——键盘输入 入口参数:无 • 出口参数:所读取的字符ASCII码在AL内。 Company Logo
第三章:汇编语言程序设计 功能:扫描键盘,若有按键按下,将字符ASCII码放入AL 中,同时在屏幕上显示这个字符,然后返回。若无键 按下,该调用等待直到有键按下为止。 例: MOV AH , 01 INT 21H • 08功能——键盘输入。 • 同01号类似,但是不在屏幕上显示输入的字符,在读取密码时常用本功能。 例: MOV AH , 08 INT 21H Company Logo
第三章:汇编语言程序设计 • 4CH功能——终止当前程序并返回操作系统。 • 调用方法: MOV AH,4CH • INT 21H • 02H功能——显示字符(一个字符) • 调用方法:DL←要显示的字符或其ASCⅡ代码 • AH←02H(调用号) • INT 21H • 注:如果字符是控制符,则实际执行相应的功能,如:在屏幕上显示一个换行符(0AH),实际上将光标转到下一行上去。 Company Logo