1 / 123

第三章: 8086 汇编语言程序设计

第三章: 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 代码表示的机器指令形式,是机器硬件 唯一能识别和执行的语言。

kevina
Download Presentation

第三章: 8086 汇编语言程序设计

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. 第三章:8086汇编语言程序设计 主讲教师:范新民

  2. 1 2 3.2.1 汇编语言源程序的格式 3.2.2 常量、标识符和表达式 3.2.3 指示性语句 3 4 3.2.4 指令性语句 5 3.2.5 宏指令 8086汇编语言程序设计

  3. 8086汇编语言程序设计 3.2.1 汇编语言源程序的格式 一、基本概念 1、机器语言、汇编语言和高级语言 机器语言:用0、1代码表示的机器指令形式,是机器硬件 唯一能识别和执行的语言。 例:机器指令0100 0000;表示(AX)+1→AX 汇编语言 :用符号表示指令的操作码、操作数。又称符号 语言。 例: INC AX ;增1指令

  4. 汇编语言源程序的格式 • 汇编语言和机器语言都是面向机器的语言,即不同的机器有不同的指令系统。 • 机器指令与机器代码是一一对应的。 • 汇编语言机器语言均属于低级语言。 高级语言: 接近人的自然语言和数学表达式。用高级语言编写的程序是脱离机器的、面向过程或面向对象的语言。如:C语言,Java语言等。

  5. 汇编语言源程序的格式 2、汇编语言的特点 • 代码长度短,执行速度最快 • 可直接有效的控制机器的运行 • 准确掌握机器运行时间 • 可最有效的利用CPU、内存、I/O资源 直接控制机器运行的场合 汇编语言常用于: 需要准确控制运行时间的场合 运行速度要求很高的场合

  6. 汇编语言源程序的格式 3、语句的类别与结构 分段结构: 最多可由4种段组成:代码段、数据段、堆栈段、附加段。 语句类别: (1)指令语句: 由汇编程序汇编成相应的能被CPU直接识别并执行的目的码,或称机器代码。 (2)宏指令语句: 允许用户为多次重复使用的程序段命名的一个名字。即将一个程序段定义为一宏指令。

  7. 第三章:汇编语言程序设计 (3)伪指令语句: 伪指令语句是一种指示性语句,这类语句向汇编程序提供汇编过程要求的一些辅助信息,如给变量分配内存单元地址、定义各种符号、实现分段等。 • 伪指令与指令性语句的区别: • 伪指令语句经汇编后不产生任何机器代码,而指令性语句经汇编后会产生相应的机器代码; • 伪指令语句所指示的操作是在程序汇编时就完成了的,而指令性语句的操作必须在程序运行时才能完成。

  8. 汇编语言源程序的格式 例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

  9. 汇编语言源程序的格式 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

  10. 汇编语言源程序的格式 二、指令性语句 [标号:] 操作码 [操作数] [;注释项] 操作码:指明操作的性质,说明计算机要执行的具体操 作。用助记符表示。 操作数:指明指令执行过程中所需的数据。可有0个、1个 或者多个表达式组成,并由它提供执行指定操作 所需要的操作数或地址。 注释项:必须以分号开头,主要用来说明程序或重要语句 的功能。

  11. 汇编语言源程序的格式 标号:对应的标识符后面必须跟有冒号,标号在汇编以 后分配有地址。标号又称为符号地址,可作为转 移指令或子程序调用的目标地址。

  12. 汇编语言源程序的格式 三、指示性语句 指示性语句是主要由命令构成的语句,用来指示汇编程序进行汇编操作。 格式: [名字/变量] 命令 参数 [;注释项] 命令:指示汇编程序进行某种汇编操作 参数:汇编操作有关的数据

  13. 3.2.2 常量、标识符和表达式 汇编语言源程序的格式 1、常量:数字常量可以是二进制数、八进制数、十进制数或十六进制数表示。字符常量是用单引号‘’括起来的ASCII字符其值是该字符的ASCII代码值。例: MOV AX,‘A’ ;AX=41H 符号常量是用符号定义的常量。例:采用符号定义语句 PORTA EQU 80HMOV AL,PORTA 与指令 MOV AL,80H 等价

  14. 汇编语言源程序的格式 2、标识符 标识符可用作符号常量、名字、变量和标号等。 组成标识符有如下规定: • 组成标识符的字符有: 大写字母:A~Z;文小写字母: a~z; 数字0~9;字符?、@、_ 、$; • 字符长度不超过3l个;首字符不能是数字; • ? 不能单独作为一个标识符; • 不能把保留字用作标识符,保留字包括助记符、寄存 器名等。

  15. 汇编语言源程序的格式 3、表达式 由常数、变量、标号通过运算符或操作符连接而成的,可分为数值表达式和地址表达式。 • 数值表达式:由算术运算符、关系运算符和逻辑运算符连接常数组成的有意义的式子,它的运算结果是数值常数,只有大小,没有属性。 • 地址表达式:由变量、标号、常数、寄存器(BP、BX、SI、DI)的内容和操作符组成的有意义的式子,它的运算结果不是一个普通的数值,总是和存储器地址相联系。如各种存储器寻址方式的汇编表示都属于简单的地址表达式

  16. 表达式中的运算符:

  17. 汇编语言源程序的格式 3.2.3 指示性语句(5条) • 程序开始和结束语句 • 段定义语句 • 过程定义语句 • 数据定义语句 • 符号定义语句

  18. 汇编语言源程序的格式 (1)给程序模块命名 NAME 命令 格式: NAME 名字 名字是程序员按标识符规定所取的程序模块名。 (2)标题命名语句 TITLE 命令 格式: TITLE 名字 名字作为每页标题打印出来,标题名字符不大于60个 (3)程序结束 END命令 格式: END [ 标号 ] 标号指示程序开始执行的起始地址的标号。 1、程序开始和结束语句

  19. 汇编语言源程序的格式 • 说明: • 如果程序中没有NAME 伪指令,可使用TITLE伪指令。 • 程序中既无NAME也无TITLE伪指令,汇编程序将用源程序名作为模块名。 • 一般情况下使用TITLE伪指令,可在列表文件中能打印出来 • END伪指令中,如果程序中第一句指令性语句有标号,则END语句的标号应与其相同否则可无标号。

  20. 汇编语言源程序的格式 2、段定义伪指令 存储器的物理地址是由段地址和偏移地址组合而成的,而存储器又可以为多个段,汇编程序是按段来组织程序和使用存储器,在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用到段定义伪指令。

  21. 汇编语言源程序的格式 (1)段定义伪指令 SEGMENT 格式: 段名 SEGMENT [定位类型] [组合类型][‘类别’] … 段名ENDS • 段名由程序员定义,汇编时由系统为该段分配一个段基值。 • 参数用来设定该段在内存中的位置和在汇编、连接时,当该段与其它段组合在一起时该段同其它段的连接关系。

  22. 汇编语言源程序的格式 一般情况下,定位类型、组合类型和类别说明可以不用。 注意:SEGMENT和ENDS语句必须成对使用。 例:定义一数据段DATA DATA SEGMENT A DB '1234' B DW 12H DATA ENDS

  23. 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 $ • $-表示汇编地址计数器的当前值

  24. 汇编语言源程序的格式 (3)指定段址伪指令 格式: ASSUME 段寄存器:段名[,段寄存器:段名,...] 功能:指明段和段寄存储器的对应关系,且段名必须是 由SEGMENT定义的段名。 • 说明: • ASSUME伪指令只是指明段和段寄存器的对应关系,并没有把段地址装入段寄存器中。但是,代码段段寄存器CS的值是由系统负责设置的。 • ASSUME指令必须跟在SEGMENT语句之后。

  25. 汇编语言源程序的格式 例: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

  26. 汇编语言源程序的格式 3. 过程定义伪指令 格式为:过程名 PROC [NEAR/FAR] … RET 过程名 ENDP 功能:过程定义伪指令用于定义子程序。段内调用使用 NEAR属性,段间调用使用FAR属性。省略为NEAR

  27. 汇编语言源程序的格式 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

  28. 汇编语言源程序的格式 4. 数据定义伪指令 格式:[变量名] 数据定义伪指令 操作数项表 功能:定义数据存储区,其类型由伪指令指定。 • 数据定义伪指令常用的有以下五种: • [变量名] DB 操作数项表;定义字节 • [变量名] DW 操作数项表;定义字 • [变量名] DD 操作数项表;定义双字 • [变量名] DQ 操作数项表;定义8个字节 • [变量名] DT 操作数项表;定义10个字节 操作数项表可以是常数或表达式、字符串、?和带DUP的表达式。

  29. 64 100 -1 1024 存储形式:COUNT→ ARRAY→ 0000H 0001H 0002H 0003H 0004H 0005H 0006H FF FF 00 04 汇编语言源程序的格式 ① 给变量赋初值或指定变量类型 例:COUNT DB 100 ARRAY DW -1,1024

  30. STR: 41H STR1: 42H 42H 41H 43H 44H ②定义一个ASCⅡ码的字符串 汇编语言源程序的格式 为字符串的每个字符分配一个存储单元,并从左到右将字符的ASCⅡ码按地址递增顺序存放在内存中。 例1: STR DB ‘ABCD’ 例2: STR1 DW ‘AB’

  31. SUB1: ? RESU: ? 汇编语言源程序的格式 ③ 用?号预留内存单元 例: SUB1 DB ? ;预留一个字节单元 RESU DW ? ;预留二个字节单元

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

  33. 汇编语言源程序的格式 5、符号定义语句 (1)EQU——赋值伪指令 格式:变量名 EQU 表达式 功能:将右边表达式的值赋给左边的变量。表达式可以是 常数、变量、标号、指令助记符、数值表达式、地 址表达式。 例:PORT1 EQU 100 ;符号PORT1代表常数100 CONT EQU CX ;为CX重新命名 ABDR EQU PORT1+1 ABC EQU DAA 注:同一程序中,不能重复定义

  34. 汇编语言源程序的格式 (2)=——等号伪指令 格式:符号名 = 表达式 功能:与EQU基本相同,两者的区别在于“=”伪指令可对 同一标识符作重新定义。 例:EMP = 12 ;定义EMP等于12 EMP = EMP+1 可以对同一个符号名重复定义。

  35. 汇编语言源程序的格式 (3)PURGE命令 格式 :PUREG 名字 功能:用来撤消已定义的符号常量。可同时撤消几个己 定义的名字 例3-10: COUNT EQU 20 ┇ MOV AL,COUNT ┇ PURGE COUNT COUNT EQU 10 MOV BL,COUNT

  36. 汇编语言源程序的格式 6、名字与变量 (1)名字 名字包括文件名、标题名、段名、过程名和符号常量名等,是程序员在编程中按标识符规定命名的,目的是方便编程和读程。 • 段命 在段定义语句中命名取定,定义后的段名可以作为段基值来使用,用来对段寄存器赋值。 例: MOV AX , DATA MOV DS , AX

  37. 汇编语言源程序的格式 • 过程名 • 在过程定义语句中定义,指向过程中第一条指令所在的内存单元的地址(入口地址),有NEAR和FAR之分。 • 符号常量 • 由符号定义语句EQU、=来定义,对符号常量给以赋值。 • 例3-13

  38. 汇编语言源程序的格式 (2)变量 • 变量的定义和属性 变量由数据定义语句DB/DW/DD/DQ/DT来定义 变量有三属性:段属性、偏移属性和类型属性: • 段属性表示变量所在段的起始地址。 • 偏移属性表示变量在段内的偏移地址。用16位无符号表示偏移地址。 • 类型属性表示该变量能存放的数据长度。长度为1B的变量,类型为BYTE,长度为2B的变量,类型为WORD等。

  39. 汇编语言源程序的格式 • 分析运算符(5个) 用于把变量的三个属性分别取出来作为操作数。 • OFFSET——取偏移地址操作符 • 格式:OFFSET 变量或标号 • 功能:返回该变量或标号在其段内的偏移地址。 例:MOV SI,OFFSET BUF 将BUF在数据段内的偏移地址作为立即数送到SI中。

  40. 汇编语言源程序的格式 SEG——取段址操作符。 格式:SEG 变量或标号 功能:返回变量或标号所在段的段基址。 例: MOV AX,SEG BUF

  41. 汇编语言源程序的格式 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。

  42. 汇编语言源程序的格式 取变量所含的数据存储单元个数操作符 LENGTH 格式:LENGTH 变量 功能:只对变量起作用,取值根据定义该变量时数据定义 伪指令后面第一个表达式的形式而定。如为重复子 句“n DUP(表达式)”,返回外层重复因子n,其他形式 的表达式,则返回1。

  43. 汇编语言源程序的格式 例: 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

  44. 汇编语言源程序的格式 取变量所含的数据存储区大小操作符 SIZE 格式:SIZE 变量 功能:汇编程序用该操作符返回的值表示该变量所分配的 总字节数。 例:A2 DW 10 DUP(1),1234H MOV CX,SIZE A2 汇编后相当于有指令: MOV CX,14H SIZE=LENGTH×TYPE

  45. 汇编语言源程序的格式 • 合成运算符 属性定义操作符 PTR 格式:类型 PTR 地址表达式 功能:PTR操作符的作用是将地址表达式的原类型属性临 时修改成PTR操作符前面所指定的类型。指定的类 型可以是BYTE、WORD或DWORD。 • 可用来指定内存操作数的类型 • 例:MOVBYTE PTR [SI], 20H;占一个字节 • 或 MOVWORD PTR [SI], 20H ;占两个字节

  46. 汇编语言源程序的格式 • 用于临时改变变量或标号的类型属性 • 例如: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 • 都是合法的。

  47. 汇编语言源程序的格式 3.2.4 指令型语句 格式 : [ 标号:] 操作码 [操作数] [,操作数 ] [;注释 ] 一、标号 标号是一条指令在内存中的符号地址。标号一定要用‘:’结束。标号具有三种属性: • 段属性:表示标号所在段的段基值 格式:SEG 标号

  48. 汇编语言源程序的格式 • 偏移量属性:表示标号所在位置的偏移地址 格式:OFFSET 标号 • 类型属性:表示标号所在指令是允许段内跳转还是 段间跳转 格式:TYPE 标号 当标号的属性为NEAR属性时,TYPE=-1。 当标号的属性为FAR属性时,TYPE=-2。

  49. 汇编语言源程序的格式 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 是标号

  50. 汇编语言源程序的格式 3.2.5 宏指令 • 宏定义: 格式: 宏指令名 MACRO [形式参数表] ┆ ┆ ENDM • 宏调用: 格式:宏指令名 [实际参数,…] 宏指令——源程序中一个能多次可重复使用的具有独立功能 的代码段。 1、宏指令的定义和使用 宏指令的使用过程有宏定义、宏调用、宏展开。 宏指令体

More Related