1.24k likes | 1.56k Views
第三章: 8086 汇编语言程序设计. 主讲教师:范新民. 1. 2. 3.2.1 汇编语言源程序的格式. 3.2.2 常量、标识符和表达式. 3.2.3 指示性语句. 3. 4. 3.2.4 指令性语句. 5. 3.2.5 宏指令. 8086 汇编语言程序设计. 8086 汇编语言程序设计. 3.2.1 汇编语言源程序的格式. 一、基本概念. 1 、机器语言、汇编语言和高级语言. 机器语言:用 0 、 1 代码表示的机器指令形式,是机器硬件 唯一能识别和执行的语言。
E N D
第三章:8086汇编语言程序设计 主讲教师:范新民
1 2 3.2.1 汇编语言源程序的格式 3.2.2 常量、标识符和表达式 3.2.3 指示性语句 3 4 3.2.4 指令性语句 5 3.2.5 宏指令 8086汇编语言程序设计
8086汇编语言程序设计 3.2.1 汇编语言源程序的格式 一、基本概念 1、机器语言、汇编语言和高级语言 机器语言:用0、1代码表示的机器指令形式,是机器硬件 唯一能识别和执行的语言。 例:机器指令0100 0000;表示(AX)+1→AX 汇编语言 :用符号表示指令的操作码、操作数。又称符号 语言。 例: INC AX ;增1指令
汇编语言源程序的格式 • 汇编语言和机器语言都是面向机器的语言,即不同的机器有不同的指令系统。 • 机器指令与机器代码是一一对应的。 • 汇编语言机器语言均属于低级语言。 高级语言: 接近人的自然语言和数学表达式。用高级语言编写的程序是脱离机器的、面向过程或面向对象的语言。如:C语言,Java语言等。
汇编语言源程序的格式 2、汇编语言的特点 • 代码长度短,执行速度最快 • 可直接有效的控制机器的运行 • 准确掌握机器运行时间 • 可最有效的利用CPU、内存、I/O资源 直接控制机器运行的场合 汇编语言常用于: 需要准确控制运行时间的场合 运行速度要求很高的场合
汇编语言源程序的格式 3、语句的类别与结构 分段结构: 最多可由4种段组成:代码段、数据段、堆栈段、附加段。 语句类别: (1)指令语句: 由汇编程序汇编成相应的能被CPU直接识别并执行的目的码,或称机器代码。 (2)宏指令语句: 允许用户为多次重复使用的程序段命名的一个名字。即将一个程序段定义为一宏指令。
第三章:汇编语言程序设计 (3)伪指令语句: 伪指令语句是一种指示性语句,这类语句向汇编程序提供汇编过程要求的一些辅助信息,如给变量分配内存单元地址、定义各种符号、实现分段等。 • 伪指令与指令性语句的区别: • 伪指令语句经汇编后不产生任何机器代码,而指令性语句经汇编后会产生相应的机器代码; • 伪指令语句所指示的操作是在程序汇编时就完成了的,而指令性语句的操作必须在程序运行时才能完成。
汇编语言源程序的格式 例3-1:对10个字节数据a1~a10求和。 DATA SEGMENT AT 2000H ARRAY DB a1 ,a2 ,a3 ,…,a10 COUNT EQU $ - ARRAY SUM DW ? DATA ENDS STACK SEGMENT PARA STACK ‘STACK’ STAK DB 10 DUP ( ?) TOP EQU LENGTH STAK STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK
汇编语言源程序的格式 START:MOV AX,DATA MOV DS,AX MOV AX,0 MOV DI,OFFSET SUM MOV BX,OFFSET ARRAY MOV CX,COUNT LOP: ADD AL,[BX] ADC AH,0 INC BX LOOP LOP MOV [DI] ,AX MOV AH ,4CH INT 21H CODE ENDS END START
汇编语言源程序的格式 二、指令性语句 [标号:] 操作码 [操作数] [;注释项] 操作码:指明操作的性质,说明计算机要执行的具体操 作。用助记符表示。 操作数:指明指令执行过程中所需的数据。可有0个、1个 或者多个表达式组成,并由它提供执行指定操作 所需要的操作数或地址。 注释项:必须以分号开头,主要用来说明程序或重要语句 的功能。
汇编语言源程序的格式 标号:对应的标识符后面必须跟有冒号,标号在汇编以 后分配有地址。标号又称为符号地址,可作为转 移指令或子程序调用的目标地址。
汇编语言源程序的格式 三、指示性语句 指示性语句是主要由命令构成的语句,用来指示汇编程序进行汇编操作。 格式: [名字/变量] 命令 参数 [;注释项] 命令:指示汇编程序进行某种汇编操作 参数:汇编操作有关的数据
3.2.2 常量、标识符和表达式 汇编语言源程序的格式 1、常量:数字常量可以是二进制数、八进制数、十进制数或十六进制数表示。字符常量是用单引号‘’括起来的ASCII字符其值是该字符的ASCII代码值。例: MOV AX,‘A’ ;AX=41H 符号常量是用符号定义的常量。例:采用符号定义语句 PORTA EQU 80HMOV AL,PORTA 与指令 MOV AL,80H 等价
汇编语言源程序的格式 2、标识符 标识符可用作符号常量、名字、变量和标号等。 组成标识符有如下规定: • 组成标识符的字符有: 大写字母:A~Z;文小写字母: a~z; 数字0~9;字符?、@、_ 、$; • 字符长度不超过3l个;首字符不能是数字; • ? 不能单独作为一个标识符; • 不能把保留字用作标识符,保留字包括助记符、寄存 器名等。
汇编语言源程序的格式 3、表达式 由常数、变量、标号通过运算符或操作符连接而成的,可分为数值表达式和地址表达式。 • 数值表达式:由算术运算符、关系运算符和逻辑运算符连接常数组成的有意义的式子,它的运算结果是数值常数,只有大小,没有属性。 • 地址表达式:由变量、标号、常数、寄存器(BP、BX、SI、DI)的内容和操作符组成的有意义的式子,它的运算结果不是一个普通的数值,总是和存储器地址相联系。如各种存储器寻址方式的汇编表示都属于简单的地址表达式
汇编语言源程序的格式 3.2.3 指示性语句(5条) • 程序开始和结束语句 • 段定义语句 • 过程定义语句 • 数据定义语句 • 符号定义语句
汇编语言源程序的格式 (1)给程序模块命名 NAME 命令 格式: NAME 名字 名字是程序员按标识符规定所取的程序模块名。 (2)标题命名语句 TITLE 命令 格式: TITLE 名字 名字作为每页标题打印出来,标题名字符不大于60个 (3)程序结束 END命令 格式: END [ 标号 ] 标号指示程序开始执行的起始地址的标号。 1、程序开始和结束语句
汇编语言源程序的格式 • 说明: • 如果程序中没有NAME 伪指令,可使用TITLE伪指令。 • 程序中既无NAME也无TITLE伪指令,汇编程序将用源程序名作为模块名。 • 一般情况下使用TITLE伪指令,可在列表文件中能打印出来 • END伪指令中,如果程序中第一句指令性语句有标号,则END语句的标号应与其相同否则可无标号。
汇编语言源程序的格式 2、段定义伪指令 存储器的物理地址是由段地址和偏移地址组合而成的,而存储器又可以为多个段,汇编程序是按段来组织程序和使用存储器,在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用到段定义伪指令。
汇编语言源程序的格式 (1)段定义伪指令 SEGMENT 格式: 段名 SEGMENT [定位类型] [组合类型][‘类别’] … 段名ENDS • 段名由程序员定义,汇编时由系统为该段分配一个段基值。 • 参数用来设定该段在内存中的位置和在汇编、连接时,当该段与其它段组合在一起时该段同其它段的连接关系。
汇编语言源程序的格式 一般情况下,定位类型、组合类型和类别说明可以不用。 注意:SEGMENT和ENDS语句必须成对使用。 例:定义一数据段DATA DATA SEGMENT A DB '1234' B DW 12H DATA ENDS
DS: 0100 0101 0102 0103 0104 0105 0106 0107 12H ? ? 22H 11H 00 00 汇编语言源程序的格式 (2)偏移地址定位语句 ORG 格式:ORG 数值表达式 功能:指定在它之后的程序段或数据块所存放的起始地 址的偏移量。 • 无ORG语句时,段偏移地址从0000H开始。 例1. DATA SEGMENT ORG 100H X DB 12H Y DW ? Z DD 1122H DATA ENDS $ • $-表示汇编地址计数器的当前值
汇编语言源程序的格式 (3)指定段址伪指令 格式: ASSUME 段寄存器:段名[,段寄存器:段名,...] 功能:指明段和段寄存储器的对应关系,且段名必须是 由SEGMENT定义的段名。 • 说明: • ASSUME伪指令只是指明段和段寄存器的对应关系,并没有把段地址装入段寄存器中。但是,代码段段寄存器CS的值是由系统负责设置的。 • ASSUME指令必须跟在SEGMENT语句之后。
汇编语言源程序的格式 例: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
汇编语言源程序的格式 3. 过程定义伪指令 格式为:过程名 PROC [NEAR/FAR] … RET 过程名 ENDP 功能:过程定义伪指令用于定义子程序。段内调用使用 NEAR属性,段间调用使用FAR属性。省略为NEAR
汇编语言源程序的格式 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
汇编语言源程序的格式 4. 数据定义伪指令 格式:[变量名] 数据定义伪指令 操作数项表 功能:定义数据存储区,其类型由伪指令指定。 • 数据定义伪指令常用的有以下五种: • [变量名] DB 操作数项表;定义字节 • [变量名] DW 操作数项表;定义字 • [变量名] DD 操作数项表;定义双字 • [变量名] DQ 操作数项表;定义8个字节 • [变量名] DT 操作数项表;定义10个字节 操作数项表可以是常数或表达式、字符串、?和带DUP的表达式。
64 100 -1 1024 存储形式:COUNT→ ARRAY→ 0000H 0001H 0002H 0003H 0004H 0005H 0006H FF FF 00 04 汇编语言源程序的格式 ① 给变量赋初值或指定变量类型 例:COUNT DB 100 ARRAY DW -1,1024
STR: 41H STR1: 42H 42H 41H 43H 44H ②定义一个ASCⅡ码的字符串 汇编语言源程序的格式 为字符串的每个字符分配一个存储单元,并从左到右将字符的ASCⅡ码按地址递增顺序存放在内存中。 例1: STR DB ‘ABCD’ 例2: STR1 DW ‘AB’
? SUB1: ? RESU: ? 汇编语言源程序的格式 ③ 用?号预留内存单元 例: SUB1 DB ? ;预留一个字节单元 RESU DW ? ;预留二个字节单元
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。
汇编语言源程序的格式 5、符号定义语句 (1)EQU——赋值伪指令 格式:变量名 EQU 表达式 功能:将右边表达式的值赋给左边的变量。表达式可以是 常数、变量、标号、指令助记符、数值表达式、地 址表达式。 例:PORT1 EQU 100 ;符号PORT1代表常数100 CONT EQU CX ;为CX重新命名 ABDR EQU PORT1+1 ABC EQU DAA 注:同一程序中,不能重复定义
汇编语言源程序的格式 (2)=——等号伪指令 格式:符号名 = 表达式 功能:与EQU基本相同,两者的区别在于“=”伪指令可对 同一标识符作重新定义。 例:EMP = 12 ;定义EMP等于12 EMP = EMP+1 可以对同一个符号名重复定义。
汇编语言源程序的格式 (3)PURGE命令 格式 :PUREG 名字 功能:用来撤消已定义的符号常量。可同时撤消几个己 定义的名字 例3-10: COUNT EQU 20 ┇ MOV AL,COUNT ┇ PURGE COUNT COUNT EQU 10 MOV BL,COUNT
汇编语言源程序的格式 6、名字与变量 (1)名字 名字包括文件名、标题名、段名、过程名和符号常量名等,是程序员在编程中按标识符规定命名的,目的是方便编程和读程。 • 段命 在段定义语句中命名取定,定义后的段名可以作为段基值来使用,用来对段寄存器赋值。 例: MOV AX , DATA MOV DS , AX
汇编语言源程序的格式 • 过程名 • 在过程定义语句中定义,指向过程中第一条指令所在的内存单元的地址(入口地址),有NEAR和FAR之分。 • 符号常量 • 由符号定义语句EQU、=来定义,对符号常量给以赋值。 • 例3-13
汇编语言源程序的格式 (2)变量 • 变量的定义和属性 变量由数据定义语句DB/DW/DD/DQ/DT来定义 变量有三属性:段属性、偏移属性和类型属性: • 段属性表示变量所在段的起始地址。 • 偏移属性表示变量在段内的偏移地址。用16位无符号表示偏移地址。 • 类型属性表示该变量能存放的数据长度。长度为1B的变量,类型为BYTE,长度为2B的变量,类型为WORD等。
汇编语言源程序的格式 • 分析运算符(5个) 用于把变量的三个属性分别取出来作为操作数。 • OFFSET——取偏移地址操作符 • 格式:OFFSET 变量或标号 • 功能:返回该变量或标号在其段内的偏移地址。 例:MOV SI,OFFSET BUF 将BUF在数据段内的偏移地址作为立即数送到SI中。
汇编语言源程序的格式 SEG——取段址操作符。 格式:SEG 变量或标号 功能:返回变量或标号所在段的段基址。 例: MOV AX,SEG BUF
汇编语言源程序的格式 TYPE——取类型操作符 格式:TYPE 变量或标号 功能:当TYPE置于变量前面时,返回变量的类型数字。 即DB为1,DW为2,DD为4,DT为10。 当TYPE置于标号前面时,返回标号的类型属性值; 当该标号为NEAR属性时,返回值为-1,标号为FAR 属性时,返回值为-2。 例:数据段中有如下定义:DATA DW 75H,134H。 执行:ADD SI,TYPE DATA。 该语句在汇编后相当于指令ADD SI,2。
汇编语言源程序的格式 取变量所含的数据存储单元个数操作符 LENGTH 格式:LENGTH 变量 功能:只对变量起作用,取值根据定义该变量时数据定义 伪指令后面第一个表达式的形式而定。如为重复子 句“n DUP(表达式)”,返回外层重复因子n,其他形式 的表达式,则返回1。
汇编语言源程序的格式 例: DATA SEGMENT A1 DB ‘ABCD',5 DUP(0) A2 DW 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
汇编语言源程序的格式 取变量所含的数据存储区大小操作符 SIZE 格式:SIZE 变量 功能:汇编程序用该操作符返回的值表示该变量所分配的 总字节数。 例:A2 DW 10 DUP(1),1234H MOV CX,SIZE A2 汇编后相当于有指令: MOV CX,14H SIZE=LENGTH×TYPE
汇编语言源程序的格式 • 合成运算符 属性定义操作符 PTR 格式:类型 PTR 地址表达式 功能:PTR操作符的作用是将地址表达式的原类型属性临 时修改成PTR操作符前面所指定的类型。指定的类 型可以是BYTE、WORD或DWORD。 • 可用来指定内存操作数的类型 • 例:MOVBYTE PTR [SI], 20H;占一个字节 • 或 MOVWORD PTR [SI], 20H ;占两个字节
汇编语言源程序的格式 • 用于临时改变变量或标号的类型属性 • 例如:BUFW DW 1234H, 5678H • MOV AX, BUFW • MOV AL , BYTE PTR BUFW • 可用EQU 和PTR定义一个新的变量 • 例如 :BUFW DW 1234H , 5678H • BUFB EQU BYTE PTR BUFW • 则 MOV AX , BUFW 和 MOV AL , BUFB • 都是合法的。
汇编语言源程序的格式 3.2.4 指令型语句 格式 : [ 标号:] 操作码 [操作数] [,操作数 ] [;注释 ] 一、标号 标号是一条指令在内存中的符号地址。标号一定要用‘:’结束。标号具有三种属性: • 段属性:表示标号所在段的段基值 格式:SEG 标号
汇编语言源程序的格式 • 偏移量属性:表示标号所在位置的偏移地址 格式:OFFSET 标号 • 类型属性:表示标号所在指令是允许段内跳转还是 段间跳转 格式:TYPE 标号 当标号的属性为NEAR属性时,TYPE=-1。 当标号的属性为FAR属性时,TYPE=-2。
汇编语言源程序的格式 2、操作数 操作数可以用段名、符号常量、变量、属性表达式、过程名和标号等。例如: MOV AX , DATA ;DATA是段名 MOV CX , COUNT ; COUNT 是符号常量 MOV BL , BUFFER ; BUFFER 是变量 MOV SI , OFFSET ARRAY;OFFSET ARRAY是属 ;性表达式 CALL SBRT1 ;SBRT1 是过程名 JMP DONE; DONE 是标号
汇编语言源程序的格式 3.2.5 宏指令 • 宏定义: 格式: 宏指令名 MACRO [形式参数表] ┆ ┆ ENDM • 宏调用: 格式:宏指令名 [实际参数,…] 宏指令——源程序中一个能多次可重复使用的具有独立功能 的代码段。 1、宏指令的定义和使用 宏指令的使用过程有宏定义、宏调用、宏展开。 宏指令体