Download presentation
Presentation is loading. Please wait.
1
微型计算机系统
2
第三章:汇编语言程序设计 教学提示: 汇编语言程序设计是开发微机系统软件的基本功,在程序设计中具有十分重要的地位。在该章中我们将介绍汇编语言的基本概念、基本语法规则和语句结构,以及汇编语言程序设计的基本方法。 教学要求: 掌握汇编语言的程序设计方法。汇编语言主要用于帮助我们深入地了解计算机的体系结构;编制控制硬件的底层程序。对于本章中出现的基础程序,必须熟练地掌握;对于本章中出现的偏向高层应用的程序,则要进行必要的了解。 Company Logo
3
本章主要内容: 3.1 汇编语言语句 3.2 伪指令 3.3 宏指令 3.4 常用的DOS与BIOS中断功能调用 3.5 顺序程序设计
3.2 伪指令 3.3 宏指令 3.4 常用的DOS与BIOS中断功能调用 3.5 顺序程序设计 3.6 分支程序设计 3.7 循环程序设计 3.8 子程序设计 Company Logo
4
机器语言:用0、1代码表示的机器指令形式,是机器硬件唯一能识别和执行的语言。
第三章:汇编语言程序设计 § 3.1 汇编语言语句 一、机器语言、汇编语言和高级语言 机器语言:用0、1代码表示的机器指令形式,是机器硬件唯一能识别和执行的语言。 例:机器指令 ;表示(AX)+1→AX 汇编语言 :用符号表示指令的操作码、操作数。又称符号语言。 例:INC AX ;增1指令 Company Logo
5
汇编语言和机器语言都是面向机器的语言,即不同的机器有不同的指令系统。
第三章:汇编语言程序设计 汇编语言和机器语言都是面向机器的语言,即不同的机器有不同的指令系统。 汇编指令与机器代码是一一对应的。 汇编语言、机器语言均属于低级语言。 高级语言: 接近人的自然语言和数学表达式。用高级语言编写的程序是脱离机器的、面向过程或面向对象的语言。如:C语言,Java语言等。 Company Logo
6
汇编语言常用于: 需要准确控制运行时间的场合 运行速度要求很高的场合
第三章:汇编语言程序设计 二、汇编语言的特点 代码长度短,执行速度最快 可直接有效的控制机器的运行 准确掌握机器运行时间 可最有效的利用CPU、内存、I/O资源 直接控制机器运行的场合 汇编语言常用于: 需要准确控制运行时间的场合 运行速度要求很高的场合 Company Logo
7
由汇编程序汇编成相应的能被CPU直接识别并执行的目的码,或称机器代码。
第三章:汇编语言程序设计 三、语句的类别与结构 1. 汇编语句的类别 指令语句: 由汇编程序汇编成相应的能被CPU直接识别并执行的目的码,或称机器代码。 宏指令语句: 允许用户为多次重复使用的程序段命名的一个名字。包括指令语句和伪指令语句,即将一个程序段定义为一宏指令。 Company Logo
8
伪指令语句是一种指示性语句,这类语句向汇编程序提供汇编过程要求的一些辅助信息,如给变量分配内存单元地址、定义各种符号、实现分段等。
第三章:汇编语言程序设计 伪指令语句: 伪指令语句是一种指示性语句,这类语句向汇编程序提供汇编过程要求的一些辅助信息,如给变量分配内存单元地址、定义各种符号、实现分段等。 伪指令与指令性语句的区别: 伪指令语句经汇编后不产生任何机器代码,而指令性语句经汇编后会产生相应的机器代码; 伪指令语句所指示的操作是在程序汇编时就完成了的,而指令性语句的操作必须在程序运行时才能完成。 Company Logo
9
操作项:指明操作的性质,说明计算机要执行的具体操作。 用助记符表示。可以是指令、宏指令语句、伪指 令的助记符。
第三章:汇编语言程序设计 2、汇编语言的语句格式 [名字项] 操作项 [操作数] [;注释项] 操作项:指明操作的性质,说明计算机要执行的具体操作。 用助记符表示。可以是指令、宏指令语句、伪指 令的助记符。 操作数:指明指令执行过程中所需的数据。可有0个、1个 或者多个表达式组成,并由它提供执行指定操作 所需要的操作数或地址。 Company Logo
10
注释项:必须以分号开头,主要用来说明程序或重要语句的 功能。
第三章:汇编语言程序设计 注释项:必须以分号开头,主要用来说明程序或重要语句的 功能。 名字项:是用标识符表示的符号 在指令和宏指令中,称为标号。且对应的标识符后面必须跟有冒号,标号在汇编以后分配有地址。标号又称为符号地址,可作为转移指令或子程序调用的目标地址。 若名字项出现在伪指令语句前,则该名字项称为符号名,根据不同的伪指令,这些符号名又可分为变量名、符号常数名、子程序名或段名等。 Company Logo
11
名字不能使用汇编语言的专用保留字、寄存器名、汇编语言中的指令助记符等。
第三章:汇编语言程序设计 名字项的书写规定,可使用下列字符: 字母:A~Z,a~z 数字:0~9 名字不能使用汇编语言的专用保留字、寄存器名、汇编语言中的指令助记符等。 Company Logo
12
操作数项的常见形式有:常数、寄存器、标号、变量或表达式。
第三章:汇编语言程序设计 四、指令语句的操作数 操作数项的常见形式有:常数、寄存器、标号、变量或表达式。 常数:常数分为数值常数、字符串常数和符号常数。 数字常数:若数的最高位以字母A~F开头,则必须在它前面加一个0。 字符串常数:是指用单引号括起来的一个字符或多个字符的序列。 如:MOV AH,`B`指令和MOV AH,42H是等价的。 符号常数:数据段中用EQU伪指令或“=”伪指令定义的 Company Logo
13
变量:变量是一个数据存储单元的名字,即数据存放地址 的符号表示。定义变量实际上就是给变量分配内存
第三章:汇编语言程序设计 变量:变量是一个数据存储单元的名字,即数据存放地址 的符号表示。定义变量实际上就是给变量分配内存 单元。 如:ARRAYT DW 1,0,3,49 变量有3种属性:段属性、偏移属性和类型属性 段属性表示变量所在段的起始地址。 偏移属性表示变量在段内的偏移地址。用16位无符号表示偏移地址。 类型属性表示该变量能存放的数据长度。长度为1B的变量,类型为 ,长度为2B的变量,类型为 等。 BYTE WORD Company Logo
14
标号:在指令语句前面,后面跟冒号(:) ,表示指令的符 号地址,指示汇编后该指令代码在内存中的位置。
第三章:汇编语言程序设计 标号:在指令语句前面,后面跟冒号(:) ,表示指令的符 号地址,指示汇编后该指令代码在内存中的位置。 它也有3种属性:段属性、偏移属性和类型属性。 段属性表示该标号的段起始地址,该地址一定在CS段中 偏移属性表示标号在代码段中的段内偏移地址。是一个16位的无符号数。 类型属性表示该标号是在本段内引用,还是在其它段中引用。在段内引用的标号为NEAR属性,在段外引用的标号为FAR属性。 Company Logo
15
表达式:由常数、变量、标号通过运算符或操作符连接而成 的,可分为数值表达式和地址表达式。
第三章:汇编语言程序设计 表达式:由常数、变量、标号通过运算符或操作符连接而成 的,可分为数值表达式和地址表达式。 数值表达式:由算术运算符、关系运算符和逻辑运算符连接常数组成的有意义的式子,它的运算结果是数值常数,只有大小,没有属性。 地址表达式:由变量、标号、常数、寄存器(BP、BX、SI、DI)的内容和操作符组成的有意义的式子,它的运算结果不是一个普通的数值,总是和存储器地址相联系。如各种存储器寻址方式的汇编表示都属于简单的地址表达式 Company Logo
16
数值表达式中进行算术运算的符号称运算符,地址表达式中的运算符称为操作符。
第三章:汇编语言程序设计 五、 指令语句中的运算符和操作符 数值表达式中进行算术运算的符号称运算符,地址表达式中的运算符称为操作符。 1、运算符 算术运算符有+、―、*、/、MOD、右移SHR和左移SHL运算符。要求参加运算的数(或地址)均为整数,运算的结果也为整数,除法运算的结果是商的整数部分。 逻辑运算符依次为NOT、AND、OR和XOR。按位进行操作,其结果为整数常量。 Company Logo
17
LE 小于或等于(Less or Equal) GT 大于(Greater) GE 大于或等于(Greater or Equal)
第三章:汇编语言程序设计 关系运算符有6种,它们分别是: EQ 相等(Equal) NE 不等(Not Equal) LT 小于(Less) LE 小于或等于(Less or Equal) GT 大于(Greater) GE 大于或等于(Greater or Equal) 用于两个表达式值的比较,表达式的值一定是常数或是同一段内的偏移地址,比较的结果为逻辑值,关系成立,结果为真,用全“1”表示;关系不成立,结果为假,用全“0”表示 Company Logo
18
功能:返回该变量或标号在其段内的偏移地址。
第三章:汇编语言程序设计 2. 操作符 1) 数值回送操作符(5个) OFFSET——取偏移地址操作符 格式:OFFSET 变量或标号 功能:返回该变量或标号在其段内的偏移地址。 例:MOV SI,OFFSET BUF ;将BUF在数据段内的偏移地址作为立即数送到SI中。 等效于指令 : LEA SI,BUF SEG——取段址操作符。 格式:SEG 变量或标号 功能:返回变量或标号所在段的段基址。 例: MOV AX,SEG BUF Company Logo
19
功能:当TYPE置于变量前面时,返回变量的类型数字。 即DB为1,DW为2,DD为4,DQ为8,DT为10。
第三章:汇编语言程序设计 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
20
第三章:汇编语言程序设计 LENGTH——取变量所含的数据个数操作符 格式:LENGTH 变量
功能:只对变量起作用,取值根据定义该变量时数据定义伪指令后面第一个表达式的形式而定。如为重复子句“n DUP(表达式)”,返回外层重复因子n,其它形式的表达式,则返回1。 例: DATA SEGMENT A1 DB ‘ABCD’,5 DUP(0) A2 DB 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
21
SIZE——取变量所含的数据存储区大小操作符 格式:SIZE 变量 功能:汇编程序用该操作符返回的值表示该变量所分配的总字 节数。
第三章:汇编语言程序设计 SIZE——取变量所含的数据存储区大小操作符 格式:SIZE 变量 功能:汇编程序用该操作符返回的值表示该变量所分配的总字 节数。 SIZE=LENGTH×TYPE 例:A2 DW 10 DUP(1),1234H MOV CX,SIZE A2 汇编后相当于有指令: MOV CX, 14H Company Logo
22
属性修改操作符主要用于临时修改变量、标号或某个内存单元中的操作数的类型属性,它们共有5种(看书)。
第三章:汇编语言程序设计 2) 属性修改操作符 属性修改操作符主要用于临时修改变量、标号或某个内存单元中的操作数的类型属性,它们共有5种(看书)。 PTR——属性定义操作符 格式:类型 PTR 地址表达式 功能:PTR操作符的作用是将地址表达式的原类型属性临时修改成PTR操作符前面所指定的类型。指定的类型可以是BYTE、WORD或DWORD。 例:MOV BYTE PTR [SI], 20H ;占一个字节 或 MOV WORD PTR [SI], 20H ;占两个字节 Company Logo
23
第三章:汇编语言程序设计 运算符的优先顺序 ( )、[ ]、LENGTH、SIZE
PTR、OFFSET、SEG、TYPE、THIS、段操作数(:) HIGH、LOW *、/、MOD、SHL、SHR +、- EQ、NE、LT、LE、GT、GE NOT AND OR、XOR Company Logo
24
格式:[变量名] 数据定义伪指令 操作数项表 功能:定义数据存储区,其类型由伪指令指定。
第三章:汇编语言程序设计 § 3.2 伪指令 伪指令又称伪操作,它不像机器指令那样是在程序运行期间由计算机来执行的,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如数据定义、分配存储区、指示程序结束等功能。 § 数据定义与符号定义伪指令 1. 数据定义伪指令 格式:[变量名] 数据定义伪指令 操作数项表 功能:定义数据存储区,其类型由伪指令指定。 Company Logo
25
操作数项表可以是常数或表达式、字符串、?和带DUP的表达式。
第三章:汇编语言程序设计 数据定义伪指令常用的有以下五种: [变量名] DB 操作数项表;定义字节 [变量名] DW 操作数项表;定义字 [变量名] DD 操作数项表;定义双字 [变量名] DQ 操作数项表;定义8个字节 [变量名] DT 操作数项表;定义10个字节 操作数项表可以是常数或表达式、字符串、?和带DUP的表达式。 Company Logo
26
100 -1 1024 第三章:汇编语言程序设计 给变量赋初值或指定变量类型 例:COUNT DB 100 ARRAY DW -1,1024
04H 00H FFH 64H 存储形式:COUNT→ ARRAY→ 100 -1 1024 Company Logo
27
为字符串的每个字符分配一个存储单元,并从左到右 将字符的ASCⅡ码按地址递增顺序存放在内存中。
第三章:汇编语言程序设计 定义一个ASCⅡ码的字符串 为字符串的每个字符分配一个存储单元,并从左到右 将字符的ASCⅡ码按地址递增顺序存放在内存中。 例1: STR DB ‘ABCD’ 例2: STR1 DW ‘AB’ 44H 42H 41H 43H STR: 41H 42H STR1: Company Logo
28
第三章:汇编语言程序设计 用?号预留内存单元 例: SUB1 DB ? ;预留一个字节单元 RESU DW ? ;预留二个字节单元
Company Logo
29
例1: DA1 DB 2 DUP(0) DA2 DB 2 DUP(‘AB’) DA3 DW 2 DUP(1)
第三章:汇编语言程序设计 用DUP重复因子初始化一个数据区 格式:N DUP (表达式) ?、数值、 数值表达式 字符等 重复次数 重复装入的内容 00 01 42 41 DA1 DA2 DA3 例1: DA1 DB 2 DUP(0) DA2 DB 2 DUP(‘AB’) DA3 DW 2 DUP(1) 例2:DUP的嵌套使用 DATA DB 10 DUP(10 DUP(0)) 定义了100个字节全部初始化为0。 Company Logo
30
功能:将右边表达式的值赋给左边的变量。表达式可以是常 数、变量、标号、指令助记符、数值表达式、地址表达 式。
第三章:汇编语言程序设计 2. 符号定义伪指令 EQU——赋值伪指令 格式:变量名 EQU 表达式 功能:将右边表达式的值赋给左边的变量。表达式可以是常 数、变量、标号、指令助记符、数值表达式、地址表达 式。 例:PORT1 EQU 100 ;符号PORT1代表常数100 CONT EQU CX ;为CX重新命名 ABDR EQU PORT1+1 ABC EQU DAA 注:同一程序中,不能重复定义 Company Logo
31
功能:与EQU基本相同,两者的区别在于“=”伪指令可对同 一标识符作重新定义。
第三章:汇编语言程序设计 =——等号伪指令 格式:符号名 = 表达式 功能:与EQU基本相同,两者的区别在于“=”伪指令可对同 一标识符作重新定义。 例:EMP = ;定义EMP等于12 EMP = EMP+1 可以对同一个符号名重复定义。 Company Logo
32
段名 SEGMENT [定位类型] [组合类型][‘类别’] … 段名 ENDS
第三章:汇编语言程序设计 § 段定义伪指令 1. 段定义伪指令 存储器的物理地址是由段地址和偏移地址组合而成的,而存储器又可以为多个段,汇编程序是按段来组织程序和使用存储器,在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用到段定义伪指令。 格式如下: 段名 SEGMENT [定位类型] [组合类型][‘类别’] … 段名 ENDS Company Logo
33
一般情况下,定位类型、组合类型和类别说明可以不用。但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要使用这些说明。
第三章:汇编语言程序设计 一般情况下,定位类型、组合类型和类别说明可以不用。但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要使用这些说明。 注意:SEGMENT和ENDS语句必须成对使用。 例:定义一数据段DATA DATA SEGMENT A DB '1234' B DW 12H DATA ENDS Company Logo
34
格式:ASSUME 段寄存器:段名[,段寄存器:段名,...] 功能:指明段和段寄存器的对应关系,且段名必须是由 SEGMENT定义的段名。
第三章:汇编语言程序设计 2. 指定段址伪指令 格式:ASSUME 段寄存器:段名[,段寄存器:段名,...] 功能:指明段和段寄存器的对应关系,且段名必须是由 SEGMENT定义的段名。 注意:ASSUME伪指令只是指明段和段寄存器的对应关系,并没有把段地址装入段寄存器中。但是,代码段段寄存器CS的值是由系统负责设置的。 Company Logo
35
ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX
第三章:汇编语言程序设计 例:DATA SEGMENT X DB 12H DATA ENDS STACK SEGMENT DW DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX ┆ CODE ENDS END START Company Logo
36
1. 模块定义伪指令NAME/END(程序开始与结束语句) 格式: NAME 模块名 … END 标号
第三章:汇编语言程序设计 § 模块定义伪指令 1. 模块定义伪指令NAME/END(程序开始与结束语句) 格式: NAME 模块名 … END 标号 功能:由NAME和END定义一个程序模块。标号为模块执行时 的起始地址。 说明:① 如果程序中没有NAME伪指令,则将用源程序文件名 作为模块名。 ② 标号指示程序开始执行的起始地址的标号。 Company Logo
37
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX ┆ HLT CODE ENDS
第三章:汇编语言程序设计 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
38
格式为:过程名 PROC [NEAR/FAR] … RET 过程名 ENDP 功能:过程定义伪指令用于定义子程序。段内调用使用NEAR
第三章:汇编语言程序设计 § 过程定义伪指令 格式为:过程名 PROC [NEAR/FAR] … RET 过程名 ENDP 功能:过程定义伪指令用于定义子程序。段内调用使用NEAR 属性,段间调用使用FAR属性。省略为NEAR。 Company Logo
39
第三章:汇编语言程序设计 CODE SEGMENT COUNT PROC NEAR ADD CX,1 RET COUNT ENDP
START:MOV AX,100 ┊ CALL COUNT HLT CODE ENDS END START 子程序: COUNT PROCE ┆ RET Company Logo
40
功能:指定在它之后的程序段或数据块所存放的起始地址的 偏移量。
第三章:汇编语言程序设计 § 其他伪指令 1. ORG伪指令 格式:ORG 数值表达式。 功能:指定在它之后的程序段或数据块所存放的起始地址的 偏移量。 无ORG语句时,段偏移地址从0000H开始。 00 11H 22H ? 12H DS: 例1. DATA SEGMENT ORG 100H X DB 12H Y DW ? Z DD H DATA ENDS $-表示汇编地址计数器的当前值 $ Company Logo
41
第三章:汇编语言程序设计 利用$-变量名,动态确定数据区字节 例2. DATA SEGMENT DA1 DB 1,2,3,4
DA2 DW 4 DUP(?) COUNT EQU $-DA1 ; DATA ENDS Count=? 12-0→COUNT Company Logo
42
第三章:汇编语言程序设计 § 3.2.6 汇编语言源程序的结构 一般格式如下: NAME 模块名(可有可无) 数据段名 SEGMENT
§ 汇编语言源程序的结构 一般格式如下: 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
43
宏指令——源程序中一个能多次可重复使用的具有独立功能 的代码段。
第三章:汇编语言程序设计 § 3.3 宏指令 宏指令——源程序中一个能多次可重复使用的具有独立功能 的代码段。 1、宏指令的定义和使用 宏指令的使用过程有宏定义、宏调用、宏展开。 宏定义: 格式: 宏指令名 MACRO [形式参数表] ┆ ENDM 宏调用: 格式: 宏指令名 [实际参数,…] 宏指令体 Company Logo
44
例:完成AX的内容乘以2X的宏定义及宏调用 定义宏:MULX MACRO PX 形式参数 宏指令名 MOV CL,PX SAL AX,CL
第三章:汇编语言程序设计 例:完成AX的内容乘以2X的宏定义及宏调用 定义宏:MULX MACRO PX 形式参数 宏指令名 MOV CL,PX SAL AX,CL ENDM 实际参数 宏调用: ┆ MULX ; ┆ MULX ; MULX ; AX←(AX)*22 AX←(AX)*24 AX←(AX)*25 Company Logo
45
第三章:汇编语言程序设计 宏展开:在汇编宏指令时,宏汇编程序将宏指令体插入到宏指 令所在的位置,并用实际参数代替形式参数。
例:两数相乘,返回积。 宏定义:MULT MACRO OPR1,OPR2,RESULT MOV AL,OPR1 IMUL OPR2 MOV RESULT,AX ENDM 宏调用: ┆ MULT 120,BL,SAVE MOV AL,120 IMUL BL MOV SAVE,AX Company Logo
46
第三章:汇编语言程序设计 § 3.4 常用的DOS与BIOS中断功能调用 § 3.4.1 DOS中断与系统功能调用 1. DOS中断
DOS除了给用户提供了命令行服务以外,还为汇编语言程序员提供了大量的子程序,这些子程序包含了从基本输入输出到内存管理、磁盘读写、文件系统等各个方面,使用这些子程序,使得汇编语言程序员不必搞清大量的设备接口、数据结构等细节,即可完成所需功能,简化了汇编语言的编程。由于DOS提供的这些子程序被看作是DOS系统功能的一部分,因而人们把对这些子程序的调用又称为DOS功能调用。 Company Logo
47
第三章:汇编语言程序设计 DOS提供的这些子程序位于DOS的基本系统文件IBMBIO.COM和IBMDOS.COM中,随着DOS的加载而进入内存,即只要能启动DOS就可以使用。DOS的这些子程序是以中断的方式向系统及应用程序提供服务的,故必须采用软中断指令INT进行调用。 随着DOS的发展,所提供的功能(子程序)越来越多,不可能每一个子程序都占用一个中断号,于是采用让它们共用一个中断号,即21H号的办法,进入这一个中断后,DOS再根据应用户程序中子程序编号的设置来确定用户程序到底想调用哪一个子功能。 Company Logo
48
调置入口参数,如果所调用的子程序不需参数,则可省略此步。
第三章:汇编语言程序设计 2. DOS系统功能调用 DOS功能调用的方法 调置入口参数,如果所调用的子程序不需参数,则可省略此步。 欲调用的子程序编号→AH。 发中断调用指令INT 21H。 DOS基本I/O功能调用 01功能——键盘输入 入口参数:无 出口参数:所读取的字符ASCII码在AL内。 Company Logo
49
功能:扫描键盘,若有按键按下,将字符ASCII码放入AL 中,同时在屏幕上显示这个字符,然后返回。若无键 按下,该调用等待直到有键按下为止。
第三章:汇编语言程序设计 功能:扫描键盘,若有按键按下,将字符ASCII码放入AL 中,同时在屏幕上显示这个字符,然后返回。若无键 按下,该调用等待直到有键按下为止。 例: MOV AH , 01 INT 21H 08功能——键盘输入。 同01号类似,但是不在屏幕上显示输入的字符,在读取密码时常用本功能。 例: MOV AH , 08 INT 21H Company Logo
50
4CH功能——终止当前程序并返回操作系统。 调用方法: MOV AH,4CH INT 21H
第三章:汇编语言程序设计 4CH功能——终止当前程序并返回操作系统。 调用方法: MOV AH,4CH INT 21H 02H功能——显示字符(一个字符) 调用方法:DL←要显示的字符或其ASCⅡ代码 AH←02H(调用号) INT 21H 注:如果字符是控制符,则实际执行相应的功能,如:在屏幕上显示一个换行符(0AH),实际上将光标转到下一行上去。 Company Logo
51
注:预先将字符串存放于DX表示的首地址区域,字符串必须以
第三章:汇编语言程序设计 例:MOV DL ,‘0A' MOV AH ,2 INT 21H 09H功能——字符串输出显示 调用方法:DX←要显示的字符串首地址 AH←09H(调用号) INT 21H 注:预先将字符串存放于DX表示的首地址区域,字符串必须以 “$”作为结束符 Company Logo
52
第三章:汇编语言程序设计 例: DATA SEGMENT BUF DB 'THIS IS A TEST ! $' DATA ENDS
CODE SEGMENT START: MOV AX , DATA MOV DS , AX MOV DX , OFFSET BUF MOV AH , 9 INT 21H MOV AH , 4CH CODE ENDS END START Company Logo
53
第一个字节:指明准备接收的最大字符数,包括回车符 第二个字节保留,由DOS在功能调用结束后填入实际输入的字符个数(不包括最后的回车符)。
第三章:汇编语言程序设计 10号功能——字符串输入 入口参数:DS:DX指向输入缓冲区。 输入缓冲区具有如下格式: 第一个字节:指明准备接收的最大字符数,包括回车符 第二个字节保留,由DOS在功能调用结束后填入实际输入的字符个数(不包括最后的回车符)。 用户输入的字符串从第三个单元开始存放 出口参数:用户实际输入字符个数在缓冲区第二个单元中。 Company Logo
54
第三章:汇编语言程序设计 DATA SEGMENT BUF DB 8 ;指明最大字符数 DB ? ;保留,供DOS填入实际字符数
DB 8 DUP(?) ;用户输入的字符存放区 DATA ENDS CODE SEGMENT ASSUME CS:CODE , DS:DATA START: MOV AX , DATA MOV DS , AX MOV DX , OFFSET BUF MOV AH , 10 INT 21H … … ;其他操作 MOV AH , 4CH CODE END Company Logo
55
第三章:汇编语言程序设计 【例3.13】 字符串的输入输出。
编一段程序先提示用户输入一个字符串,然后读取用户的输入,并将用户输入的数据在下行输出。 程序如下: DATA SEGMENT MESSAGE DB ‘PLEASE INPUT A STRING: $’ ;定义输入提示 BUF DB 255 , ? , 255 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS: CODE , DS: DATA START: MOV AX , DATA MOV DS , AX MOV DX , OFFSET MESSAGE MOV AH , 9 INT 21H ;显示输入提示信息 Company Logo
56
第三章:汇编语言程序设计 MOV DX , OFFSET BUF MOV AH , 10 INT 21H ;接收用户输入
MOV DL , 0AH ;0AH为换行符ASCII码 INT 21H ;屏幕换行 MOV BL , BUF ;用户实际输入字符数→BL MOV BH , ;将BX高8位清0,使BX=用户实际输入字符数 MOV BYTE PTR BUF+2[BX],'$’;在用户输入的字符结束处放置一个“$” MOV DX , OFFSET BUF ;用户实际输入字符起始处→DX MOV AH , 9 INT 21H ;显示用户输入的字符 MOV AH , 4CH INT 21H CODE ENDS END START Company Logo
57
存储单元移位是指其中的内容左移或右移若干位。
第三章:汇编语言程序设计 § 3.5 顺序程序设计 程序有3种基本结构,即顺序结构、分支结构和循环结构。任何复杂的程序都是由基本结构组成的。顺序程序是最简单程序设计,这种程序不使用分支、循环结构,程序按顺序执行,只能完成相对简单的操作。限于这种特点,在进行顺序程序设计时应合理安排指令的先后顺序,以完成相应的功能。 § 存储单元内容移位 存储单元移位是指其中的内容左移或右移若干位。 Company Logo
58
【例3.26】 将AX寄存器中的内容左移2位,字存储单元DAT中的内容右移3位(移位后的空位补0)。
第三章:汇编语言程序设计 【例3.26】 将AX寄存器中的内容左移2位,字存储单元DAT中的内容右移3位(移位后的空位补0)。 分析:内容移位一般由移位指令实现,但要求移后空位为0,故应使用逻辑移位指令。当移位次数大于1时,可将移位次数放至CL中进行移位。操作如下: MOV CL,2 SHL AX,CL INC CL SHR DAT,CL Company Logo
59
乘法运算可用乘法指令直接完成,也可以由移位指令或加法指令完成。
第三章:汇编语言程序设计 § 乘法运算 乘法运算可用乘法指令直接完成,也可以由移位指令或加法指令完成。 例: 将寄存器AL的内容乘10,结果存至DX寄存器。 分析:对一个数进行乘10运算,可以直接使用乘法指令实现,也可由移位指令或加法指令实现。 1、 用乘法指令实现 MOV BL, 10 MUL BL ;AX←AL×BL=AL×10 MOV DX,AX Company Logo
60
第三章:汇编语言程序设计 2. 用移位指令实现 XOR AH,AH ;AH清零 SHL AX,1 ;AX←AX×2
MOV BX,AX ;存至BX寄存器 MOV CL,2 SHL AX,CL ;AX←AX×8 ADD AX,BX ;AX←AX×10 MOV DX,AX 3. 用加法指令实现 MOV AH,0 ADD AX,AX ;AX←AX×2 MOV BX,AX ;存至BX寄存器 ADD AX,AX ;AX←AX×4 ADD AX,AX ;AX←AX×8 ADD AX,BX ;AX←AX×10 MOV DX,AX Company Logo
61
第三章:汇编语言程序设计 § 3.5.3 屏蔽与置位 例: 将字节类型变量DAT的高4位置0,其余各位保持不变
§ 屏蔽与置位 对字节或字变量中的某些位进行置0操作,称为屏蔽操作。使某些位强迫置1则是置位操作。 例: 将字节类型变量DAT的高4位置0,其余各位保持不变 解:屏蔽操作多用逻辑运算指令实现。 MOV AL,DAT AND AL,0FH ;屏蔽高四位 MOV DAT,AL 一般使用逻辑或指令实现置位操作。 例如把上例中DAT变量的高四位置1,用下面指令即实现即可: OR DAT,0F0H Company Logo
62
第三章:汇编语言程序设计 § 3.5.4 拆字与合字 可以将一个存储单元中的内容拆开分别存放,也可以将两个单元的内容合在一起。
§ 拆字与合字 可以将一个存储单元中的内容拆开分别存放,也可以将两个单元的内容合在一起。 例: 将存储单元DAT中两位压缩的BCD数拆成两个非压缩BCD数(高位放在DAT+1单元,低位放在DAT+2单元)。 分析:可用移位的方法和逻辑与运算来实现。 程序如下: MOV AL,DAT MOV CL,4 SHR AL,CL ;得到高位BCD数 MOV DAT+1,AL AND AL,0FH ;得到低位BCD数 MOV DAT+2,AL Company Logo
63
第三章:汇编语言程序设计 § 3.5.5 数据与ASCII码的相互转换
如果要将一个数据显示在屏幕上,就要将显示的数据转换为ASCII码后,再调用相关的中断来显示。从键盘上输入的数据,是以ASCII码形式输入的,通常转换为数据本身再进行处理。 例: 在字节存储单元DAT中有2位十六进制的数据为65H,要求将该数据显示到屏幕上。 分析:先将每一位数转换为ASCII码,再调用DOS 02 功能,把数据显示在屏幕上。 Company Logo
64
第三章:汇编语言程序设计 DATA SEGMENT DAT DB 65H DATA ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DL,DAT MOV AL,DL ;暂存至AL寄存器 MOV CL,4 SHR DL,CL ADD DL,30H ;高位十六进制数据‘6’转换为ASCII码 MOV AH,02H INT 21H ;显示 MOV DL,AL AND DL,0FH OR DL,30H ;低位十六进制数据‘A’转换为ASCII码 MOV AH,4CH INT 21H CODE ENDS END START Company Logo
65
利用表格进行数据检索处理,是数据处理的重要方法之一,一般称之为查表法。当表格不太复杂时,可采用顺序程序设计。
第三章:汇编语言程序设计 § 查表 利用表格进行数据检索处理,是数据处理的重要方法之一,一般称之为查表法。当表格不太复杂时,可采用顺序程序设计。 【例3.33】 在以TABLE为首地址的内存中顺序存有0~10的平方数表。从键盘上输入一位数,求其平方值,结果保存至RSLT单元。 分析:只要把输入数据作为位移量与首址相加,就指向了表中平方值的地址,取其内容即为该数的平方值。 程序如下: Company Logo
66
第三章:汇编语言程序设计 DATA SEGMENT TABLE DB 0,1,4,9,16,25,36,49,64,81,100
RSLT DB ? DATA ENDS CODE SEGMENT ASSUME CS:cODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AH,08H INT 21H ;输入数据 AND AL,0FH ;将ASCII码转换为数据 XOR BX,BX MOV BL,AL ;存至BX LEA SI,TABLE MOV AL,[SI+BX] ;查表 MOV RSLT,AL ;保存结果 MOV AH,4CH INT 21H CODE ENDS END START Company Logo
67
如果条件成立则完成某项操作,否则执行其他操作或后续指令。
第三章:汇编语言程序设计 § 3.6 分支程序设计 分支程序使计算机具备判断能力,计算机可以根据给定的条件进行断断,并作出相应的处理。从而使计算机具有一定的“思维”能力。汇编语言的分支主要由转移指令实现。 § 单重分支 如果条件成立则完成某项操作,否则执行其他操作或后续指令。 (a) 条件不成立执行后续指令 (b) 条件不同执行不同操作 Company Logo
68
第三章:汇编语言程序设计 【例3.34】 在存储单元DAT中存放着1位十六进制数,将其显示到屏幕上。
分析:本题只需对该位十六进制数进行判断,方法同前。程序如下: DATA SEGMENT DAT DB 0CH DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,DAT CMP AL,9 JG OTHR ADD AL,30H ;小于10则转换为数字(0~9) JMP DISP OTHR: ADD AL,37H ;大于10则转换为大写字母(A~F) DISP: MOV DL,AL MOV AH,2 INT 21H DONE: MOV AH,4CH CODE ENDS END START Company Logo
69
第三章:汇编语言程序设计 【例3.35】 在字节存储单元X、Y中各有一个无符号数。根据这两个无符号数的大小,在屏幕显示X≥Y或X<Y。
分析:两个无符号数比大小用比较指令CMP,根据其对标志位的影响用无符号条件转移指令实现转移。 程序如下: DATA SEGMENT X DB 98H Y DB 0A0H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX Company Logo
70
第三章:汇编语言程序设计 MOV AL,X CMP Y,AL ;比较 JA YGX ;Y大于X则转YGEX MOV AL,'≥'
JMP DISP YGX: MOV AL,'<' DISP: MOV DL,'X' ;显示比较结果 MOV AH,2 INT 21H MOV DL,AL MOV DL,'Y' MOV AH,4CH CODE ENDS END START Company Logo
71
第三章:汇编语言程序设计 多重分支 在程序设计中,对几个条件同时进行判断从而确定程序的转移方向,此时只能采用数个单重分支的组合来完成,这就是多重分支结构。 例3.36】 求函数 : X+10H (X<0) Y= X (0≤X≤10) ;其中X、Y都是有符号字变量。 X- 90H (X>10) 分析:本题有3个条件进行判断,故属于多重分支程序设计。 DATA SEGMENT X DW ? Y DW ? DATA ENDS CODE SEGMENT ASSUME CS: CODE,DS:DATA Company Logo
72
第三章:汇编语言程序设计 START:MOV AX , DATA MOV DS , AX MOV AX , X CMP AX , 0
JGE CASE23 ADD AX , 10H ;第一种情况的计算结果 JMP RESULT CASE23:CMP AX , 10D JG CASE3 MOV BX,30D IMUL BX ;第二种情况的计算结果 JMP RESULT CASE3: SUB AX , 90H ;第三种情况的计算结果 RESULT:MOV Y , AX ;结果保存到变量Y中 MOV AH , 4CH INT 21H CODE ENDS END START Company Logo
73
为循环程序作准备工作,如置循环次数、地址指针或关键字,寄存器置初值及标志位设置等。
第三章:汇编语言程序设计 § 3.7 循环程序设计 在进行程序设计时,会出现某段程序反复多次执行的情况,则可用循环程序结构来实现。采用循环程序结构不仅使程序变得简洁清晰,而且减少程序对内存的占用。 § 循环程序的结构 循环程序一般由4部分构成: 1. 初始化部分 为循环程序作准备工作,如置循环次数、地址指针或关键字,寄存器置初值及标志位设置等。 2. 循环工作部分 是循环结构的主体。 Company Logo
74
地址指针或循环次数的修改等,以便继续循环。 4. 循环控制部分 循环条件的检查,以判断是否继续循环。
第三章:汇编语言程序设计 3. 参数调整部分 地址指针或循环次数的修改等,以便继续循环。 4. 循环控制部分 循环条件的检查,以判断是否继续循环。 (a) 先工作后判断循环条件 (b) 先判断循环条件后工作 Company Logo
75
第三章:汇编语言程序设计 § 3.7.2 单重循环 程序中只有一个循环体,循环体内不再含有其他循环体。
§ 单重循环 程序中只有一个循环体,循环体内不再含有其他循环体。 【例3.38】 求1~400的所有偶数的和,结果保存到RSLT存储单元。 分析:1~400间共有200个偶数,需循环200次。程序中CX寄存器同时充当了循环计数器和200个偶数值,使每一次循环CX的值减2,故CX初值为400。 程序如下:DATA SEGMENT RSLT DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA Company Logo
76
第三章:汇编语言程序设计 START:MOV AX,DATA MOV DS,AX MOV CX,400 XOR AX,AX
NEXT:ADD AX,CX ;计算偶数和 DEC CX JNZ NEXT ;200个数未完则继续循环 MOV RSLT,AX ;保存结果 MOV AH,4CH INT 21H CODE ENDS END START Company Logo
77
第三章:汇编语言程序设计 【例3.39】 在以DAT为首地址的字缓冲区中存有10个数,找出其最大的值,结果存入RSLT单元。 程序如下:
DATA SEGMENT DAT DW 1234H,0ABH,0ABCDH,9999H,0 DW 1,5678H,0BBCCH,9876H,5678H RSLT DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX Company Logo
78
第三章:汇编语言程序设计 LEA SI,DAT ;SI做地址指针 MOV AX,[SI] MOV CX,9 ;10个数共比较9次
INC SI NEXT: CMP AX,[SI] JGE GOON ;AX大于下一个数则转GOON MOV AX,[SI] ;否则将大值付给AX GOON:INC SI INC SI ;修改地址指针 LOOP NEXT ;循环 MOV RSLT,AX ;保存结果 MOV AH,4CH INT 21H CODE ENDS END START Company Logo
79
第三章:汇编语言程序设计 § 多重循环 多重循环就是循环体内含有其他循环体的结构,也称为循环嵌套。多重循环以双重循环最为常用,内外层的循环由程序员用跳转指令控制,要注意不同循环体之间的界限。 【例3.41】 在以STRG为首地址的缓冲区中存放着十六进制数“0”~“4”的ASCII码,编程以下面的格式将这些数据显示到屏幕上。 分析:采用双重循环程序实现,内循环实现每行7个数据的显示(含回车与换行的ASCII码),外循环则控制显示的行数5。 Company Logo
80
第三章:汇编语言程序设计 程序如下: DATA EGMENT
STRG DB 30H,31H,32H,33H,34H,30H,31H,32H,33H,34H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV DI,5 ;显示行数为5 XOR BX,BX ;BX清零 Company Logo
81
第三章:汇编语言程序设计 NEXT: LEA SI,STRG ADD SI,BX ;BX寄存器用于调整数据位置
MOV CX, ;每行显示数据数 MOV AH,2 DISP: MOV DL,[SI] INT 21H MOV DL,’’ ;数据间以空格相间隔 INC SI LOOP DISP ;内循环 MOV DL,0AH ;换行 MOV DL,0DH ;回车 INC BX DEC DI JNZ NEXT ;外循环 MOV AH,4CH CODE ENDS END START Company Logo
82
第三章:汇编语言程序设计 § 3.8 子程序设计 § 3.8.1 子程序与调用程序
§ 3.8 子程序设计 如果在程序中,某程序段是连在一起反复执行的,则可用循环程序结构来实现。但如果这样的程序段是在程序的不同位置反复执行,则不能用循环程序结构,此时有两种方法可提高编程效率,即采用子程序或宏。 § 子程序与调用程序 子程序是一个过程,它是由调用程序或主程序用CALL指令调用的。而子程序的返回是由RET指令实现的。主程序与子程序的调用关系如下所示: Company Logo
83
第三章:汇编语言程序设计 Company Logo
84
第三章:汇编语言程序设计 1. 段内调用 供段内调用的子程序必须被定义为NEAR类型,并与主程序位于同一个代码段中。
【例3.42】 在以STRG为首地址的缓冲区中存放着一个字符串,以―1作为结束标志,编程统计字符串长度,并将结果存入LENTH单元。要求统计字符串用子程序完成。 DATA SEGMENT STRG DB 'HFEUWINFD4632wjo#$4',-1 LENTH DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX Company Logo
85
第三章:汇编语言程序设计 LEA DX,STRG ;DX为字符串首地址,作入口参数 CALL SCONT ;调用子程序
MOV LENTH,BX ;保存结果 MOV AH,4CH INT 21H SCONT PROC NEAR PUSH SI ;保护寄存器 XOR BX,BX ;DX寄存器用于统计结果 MOV SI,DX ;传递地址指针 NEXT: CMP BYTE PTR [SI], ;是否结束标志 JZ OVER ;是则转OVER INC BX ;统计 INC SI ;修改地址指针 JMP NEXT OVER: POP SI RET SCONT ENDP CODE ENDS END START Company Logo
86
第三章:汇编语言程序设计 2. 段间调用 供段间调用的子程序必须被定义为FAR类型,并与主程序位于不同的代码段中。
【例3.43】 从键盘上输入一个长度小于100的字符串,存入以BUFF为首地址的缓冲区,其中如有大写字母,要求用子程序转换为小写字母,字符串以回车键作为结束。 分析:子程序的功能是将大写字母转换为小写字母,并单独占用一个代码段。程序如下: DATA SEGMENT BUFF DB 100 DUP(?) DATA ENDS CODE1 SEGMENT ASSUME CS:CODE1,DS:DATA Company Logo
87
第三章:汇编语言程序设计 START:MOV AX,DATA MOV DS,AX LEA SI,BUFF ;置地址指针
NEXT: MOV AH,00H INT 16H CMP AL,0DH JZ DONE ;是回车键则结束 CALL FAR PTR CHANG;调用子程序 MOV [SI],AL ;保存 INC SI ;修改地址指针 JMP NEXT DONE: MOV AH,4CH INT 21H CODE1 ENDS Company Logo
88
第三章:汇编语言程序设计 CODE2 SEGMENT ASSUME CS:CODE2 CHANG PROC FAR CMP AL,'A'
JB OVER CMP AL,'Z' JA OVER ADD AL,20H ;是大写字母则转换为小写字母 OVER: RET CHANG ENDP CODE2 ENDS END START Company Logo
89
Thank You !
Similar presentations