微型计算机原理及应用:第4章 汇编语言程序设计_第1页
微型计算机原理及应用:第4章 汇编语言程序设计_第2页
微型计算机原理及应用:第4章 汇编语言程序设计_第3页
微型计算机原理及应用:第4章 汇编语言程序设计_第4页
微型计算机原理及应用:第4章 汇编语言程序设计_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、4.1 4.1 概述概述4.2 4.2 汇编语言的程序结构与语句格式汇编语言的程序结构与语句格式4.3 4.3 汇编语言的伪指令语句汇编语言的伪指令语句4.4 4.4 汇编语言程序设计基础汇编语言程序设计基础4.5 4.5 模块化程序设计技术模块化程序设计技术4.6 4.6 实用程序设计举例实用程序设计举例4.1 概述概述机器语言机器语言:指令和数据都是二进制代码,速度快,但编写,阅读,交流困难,指令和数据都是二进制代码,速度快,但编写,阅读,交流困难,通用性差。通用性差。汇编语言:汇编语言:简单,面向机器,书写方便,易于阅读和检查。可对硬件直接操简单,面向机器,书写方便,易于阅读和检查。可对

2、硬件直接操作,内存占用少,执行速度快。作,内存占用少,执行速度快。高级语言:高级语言:独立于机器的语言,于问题本身有很好的对应关系。通用性好,独立于机器的语言,于问题本身有很好的对应关系。通用性好,占内存空间大,执行时间长。占内存空间大,执行时间长。汇编语言程序的上机处理过程汇编语言程序的上机处理过程主要的汇编程序:主要的汇编程序:MASM、TASM例:打印输出字符串例:打印输出字符串“THIS IS A SAMPLE PROGRAM” ;SAMPLE PROGRAM DISPLAY MESSAGE ;注释行注释行 STACK SEGMENT PARA STACK STACK ;定义堆栈段定义

3、堆栈段 DB 1024 DUP (0) ;在存储器的某个区域建立一个堆栈区在存储器的某个区域建立一个堆栈区 STACK ENDS DATA SEGMENT ;定义数据段定义数据段 MESSAGE DB THIS IS A SAMPLE PROGRAM. ;在存储器中存放供显示的数据在存储器中存放供显示的数据 DB 0DH,0AH, $ ;回车换行,并将回车换行,并将$作为结束符作为结束符 DATA ENDS ;数据段结束数据段结束 CODE SEGMENT ;定义代码段定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK ;告诉汇编程序段范围告诉汇编程序段范围 START

4、: PROC FAR ;将程序定义为远过程将程序定义为远过程 PUSH DS MOV AX,0 ;可用可用XOR AX,AX PUSH AX ;标准序,以便返回标准序,以便返回DOS操作系统操作系统 4.2汇编语言源程序结构与语句格式汇编语言源程序结构与语句格式例:打印输出字符串例:打印输出字符串“THIS IS A SAMPLE PROGRAM” MOV AX,DATA MOV DS,AX ;初始化初始化DS LEA BX, MESSAGE ;MESSAGE 地址偏移量给地址偏移量给BXLOOP1: CMP BYTE PRT BX,$ JE LOOP2 MOV AH,5 MOV DL,BX

5、INT 21H ;调用调用 DOS 5号中断功能进行字符打印输出号中断功能进行字符打印输出 INC BX JMP LOOP1LOOP2: RET ;返回返回DOS 操作系统操作系统START ENDP ;过程结束过程结束CODE ENDS ;代码段结束代码段结束 END START ;整个程序汇编结束整个程序汇编结束 4.2汇编语言源程序结构与语句格式汇编语言源程序结构与语句格式汇编语言源程序的结构(化简)汇编语言源程序的结构(化简)DATA SEGMENT .DATA ENDSSTACK SEGMENT STACK .STACK ENDSCODE SEGMENT ASSUME DS:DATA

6、, SS:STACK, CS:CODESTART: CODE ENDS END START对于具有多个过程的汇编程序框架对于具有多个过程的汇编程序框架STACK_SEGSEGMENTPARASTACKSTACK;定义堆栈段定义堆栈段;定义堆栈深度与堆栈段变量定义堆栈深度与堆栈段变量STACK_SEGENDSDATA_SEGSEGMENTPARAPUBLICDATA;定义数据段定义数据段;定义变量定义变量DATA_SEGENDSCODE_SEGSEGMENTPARAPUBLICCODE;定义代码段定义代码段MAINPROCFARASSUMECS:CODE_SEG,DS:DATA_SEGASSUM

7、ESS:STACK_SEGSTART:PUSHDSMOVAX,0PUSHAXMOVAX,DATA_SEGMOVDS,AX;主过程内容主过程内容RETMAINENDPPROC_APROCNEAR;子过程子过程A内容,内容,A为主过程调用为主过程调用PROC_AENDP ;其他过程内容其他过程内容CODE_SEGENDSENDSTART;整个程序汇编结束整个程序汇编结束F源程序的结构特点:源程序的结构特点:1.1.源程序由若干个段组成(堆栈段,数据段,附加段,代码段。源程序由若干个段组成(堆栈段,数据段,附加段,代码段。代码段是必代码段是必不可少的,不可少的,数据段一般放在代码段之前进行定义,先定

8、义后使用,堆栈段数据段一般放在代码段之前进行定义,先定义后使用,堆栈段一般要设置,位置放在前后均可。)一般要设置,位置放在前后均可。)2.2.代码段的起始处,用代码段的起始处,用ASSUMEASSUME来说明各个段寄存器与逻辑段的关系。并由用来说明各个段寄存器与逻辑段的关系。并由用户自己设置各段寄存器(户自己设置各段寄存器(CSCS除外除外)的初值,以建立这些逻辑段的可寻址性。)的初值,以建立这些逻辑段的可寻址性。3.3.每段以每段以SEGMENTSEGMENT开始,开始,ENDSENDS结束结束。整个源程序必须以。整个源程序必须以ENDEND语句来结束,通知语句来结束,通知汇编程序停止汇编。

9、汇编程序停止汇编。4.4.每个源程序在代码段中都必须含有返回到每个源程序在代码段中都必须含有返回到DOSDOS操作系统的指令语句,保证操作系统的指令语句,保证程序执行完毕后能自动回到程序执行完毕后能自动回到DOSDOS状态。状态。返回返回DOSDOS的两种办法的两种办法:(1 1)将主过程定义为)将主过程定义为FARFAR,最后一条指令为最后一条指令为RET RET ;并用标准序返回。并用标准序返回。 PUSH DSPUSH DS MOV AX,0 MOV AX,0 PUSH AX PUSH AX(2 2)不定义主过程为)不定义主过程为FARFAR,并无标准序,只在代码段结束之前增加两句。并无

10、标准序,只在代码段结束之前增加两句。 MOV AH,4CHMOV AH,4CH INT 21H INT 21HDOS下内存的分配示意图下内存的分配示意图F4.2.24.2.2汇编语言的语汇编语言的语句句1.1.语句的类型:语句的类型:指令语句指令语句(执行语句)对每个语句,汇编将产生一个一一对应的机器目标代码(执行语句)对每个语句,汇编将产生一个一一对应的机器目标代码伪指令伪指令语句语句(指示性语句)不产生目标代码,只是知道汇编程序如何汇编。(指示性语句)不产生目标代码,只是知道汇编程序如何汇编。宏指令语句宏指令语句 用户自定义指令,比一般的指令强,有宏功能。用户自定义指令,比一般的指令强,有

11、宏功能。2.2.指令语句格式:指令语句格式:指令语句格式:指令语句格式: 标号:标号: 前缀前缀 指令助记符指令助记符 操作数操作数 ;注释;注释 伪指令格式伪指令格式 名字名字 伪指令定义符伪指令定义符 操作数操作数 ;注释;注释 a.a.标号和名字:标号和名字: (1) (1) 冒号冒号: : 标号有,名字没有。标号有,名字没有。 (2)(2)标号标号代表的是指令所在存储单元的符号地址,作为转移,循环等的转移目标,代表的是指令所在存储单元的符号地址,作为转移,循环等的转移目标, 与具体的指令地址相联系。与具体的指令地址相联系。 名字名字用于定义常量名,变量名,过程名,段名。用于定义常量名,

12、变量名,过程名,段名。 (3) (3)标号和名字的限制:不超过标号和名字的限制:不超过3131个字符串;字母开头;不能是汇编语言有特定意个字符串;字母开头;不能是汇编语言有特定意义的保留字。义的保留字。F4.2.2汇编语言的语句汇编语言的语句b.b.助记符和定义符助记符和定义符 不可缺少,表示操作的类型。系统中共有不可缺少,表示操作的类型。系统中共有130130个助记符,个助记符,9090多种基多种基本操作。本操作。c. c. 操作数操作数 指令语句中的指令语句中的操作对象操作对象和和存放位置及寻址方式存放位置及寻址方式。 伪指令中根据伪操作命令的不同而不同。伪指令中根据伪操作命令的不同而不同

13、。d.d.注释注释;开始,用来说明语句的功能,便于进行阅读。不汇编也不执行。;开始,用来说明语句的功能,便于进行阅读。不汇编也不执行。F语句中的操作数语句中的操作数1.1.常量操作数常量操作数二进制二进制 xxxxxxxxBxxxxxxxxB01000101B01000101B八进制八进制 xxxOxxxO或或xxxQxxxQ 721O721O或或721721Q Q十进制十进制 xxxxxxxx或或xxxxDxxxxD19911991或或19911991D D十六进制十六进制xxxxHxxxxH0F1D4H0F1D4H字符串字符串 xxxxxx或或“xxx”xxx”ABAB 整型数值常量、字符

14、串常量整型数值常量、字符串常量 和以赋值的常数标识符(符号常量)和以赋值的常数标识符(符号常量) 数值常量、符号常量(用数值常量、符号常量(用EQUEQU或或= =定义)定义)注意注意: (1): (1)十六进制的第一个数字必须是十六进制的第一个数字必须是0 0 9 9。 ABAB应写为应写为 0 0ABAB (2)(2) 字符常量用单引号括起来。字符常量用单引号括起来。F语句中的操作数语句中的操作数2.2.寄存器操作数寄存器操作数 操作数是寄存器名操作数是寄存器名3.3.存储器操作数存储器操作数 标号:某条指令所存放单元的符号地址或过程起点位置,在代码段内。标号:某条指令所存放单元的符号地址

15、或过程起点位置,在代码段内。 变量:存放在存储单元的值。变量名可认为是存放数据的存储单元的变量:存放在存储单元的值。变量名可认为是存放数据的存储单元的符号地址,符号地址, 一般在数据段或堆栈段。一般在数据段或堆栈段。 存储器操作数的存储器操作数的三种属性三种属性: 段属性段属性: 段基址段基址 偏移量偏移量: 相对于段基址的段内偏移量。相对于段基址的段内偏移量。 类型类型: BYTE ,WORD, DWORD, BYTE ,WORD, DWORD, 四字和十字节,四字和十字节, NEAR, FARNEAR, FAR4.4.表达式操作数表达式操作数 (由操作数、运算符和操作符组成)(由操作数、运

16、算符和操作符组成)(P127,128P127,128) 数值表达式数值表达式 地址表达式地址表达式操作数可以是寄存器、常量(数值常量、符号常量)、存储器操作数(标号、变量)操作数可以是寄存器、常量(数值常量、符号常量)、存储器操作数(标号、变量)运算符包括:算术运算符、逻辑运算符、关系运算符、数值返回运算符和属性运算运算符包括:算术运算符、逻辑运算符、关系运算符、数值返回运算符和属性运算F语句中的操作数语句中的操作数算术运算符算术运算符 + - + - * * / / MOD MOD (变量地址变量地址+/-+/-) 逻辑运算符逻辑运算符 (位)(位)AND/OR/XOR/NOTAND/OR/

17、XOR/NOT关系运算符关系运算符 关系运算符有:关系运算符有:EQEQ(等于),等于),NENE(不等),不等),LTLT(小于),小于),GTGT(大于),大于),LELE(小于或等于),小于或等于),GEGE(大于或等于)等。大于或等于)等。 参与关系运算的必须是参与关系运算的必须是两个数值两个数值,或同一段中的,或同一段中的两个存储单元地址两个存储单元地址,但运算结,但运算结 果只可能是两个特定的数值之一:果只可能是两个特定的数值之一:当关系不成立(假)时,结果为当关系不成立(假)时,结果为0 0;当关系成立;当关系成立(真)时,结果为(真)时,结果为0 0FFFFHFFFFH。例如,

18、例如,MOV AXMOV AX,4 EQ 34 EQ 3;关系不成立关系不成立,故(,故(AX)AX)0 0 MOV AX MOV AX,4 NE 34 NE 3;关系成立关系成立,故(,故(AX)AX)0FFFFH0FFFFHF语句中的操作数语句中的操作数分析运算符分析运算符 用以分析提取一个存储器操作数的属性,如段、偏用以分析提取一个存储器操作数的属性,如段、偏移量或类型等。移量或类型等。 OFFSETOFFSET、SEGSEG、TYPETYPE、SIZESIZE、LENGTHLENGTH;合成运算符合成运算符 可规定存储器操作数的某个属性,例如类型。可规定存储器操作数的某个属性,例如类型

19、。 PTRPTR、THISTHIS、SHORT SHORT (类似类型强制转换)类似类型强制转换) INC WORD PTR BX INC WORD PTR BX ADD BYTE PTR 1000H, 38H ADD BYTE PTR 1000H, 38HF4.3汇编语言的伪指令语句汇编语言的伪指令语句指示性语句又称为伪指令指示性语句又称为伪指令, ,伪指令语句没有对应的机器指令伪指令语句没有对应的机器指令, ,不由不由CPUCPU执行执行, ,而是在汇编而是在汇编程序汇编时识别程序汇编时识别, ,用于说明用于说明CPUCPU的类型的类型, ,段结构段结构, ,源程序起止信息和段内存安排等源

20、程序起止信息和段内存安排等. .4.3.14.3.1基本伪指令基本伪指令一、符号定义伪指令一、符号定义伪指令符号名符号名 EQU EQU 表达式表达式(全局,唯一,同一源程序只能定义一次,汇编替换)(全局,唯一,同一源程序只能定义一次,汇编替换) COUNT EQU 2000 COUNT EQU 2000 (P137P137)符号名符号名 = = 表达式表达式 COUNT=2000 (COUNT=2000 (功能与功能与EQUEQU类似,但可多次定义)类似,但可多次定义)二、数据定义伪指令二、数据定义伪指令1.1.数据定义的格式:数据定义的格式: 变量名变量名 数据定义符数据定义符 操作数操作

21、数 ,操作数,操作数 . . ,操作数,操作数 数据定义符:数据定义符:DB, DW,DD, DQ, DTDB, DW,DD, DQ, DT2.2.数据定义语句的具体形式和功能数据定义语句的具体形式和功能(p135) (p135) (1 1)为数据项分配存储单元,用变量名表示存储单元的名称)为数据项分配存储单元,用变量名表示存储单元的名称 (2 2)预留若干字节预留若干字节 ? (3 3)引入若干个用逗号分隔的操作数用来定义一个表(数组)引入若干个用逗号分隔的操作数用来定义一个表(数组) DUP DUP 重复数据定义操作符,重复数据定义操作符, 可重迭和嵌套使用。可重迭和嵌套使用。 (4 4)

22、用)用DBDB伪指令在内存中定义一个字符串伪指令在内存中定义一个字符串F4.3汇编语言的伪指令语句汇编语言的伪指令语句(5 5)当操作数式标号或变量时,用)当操作数式标号或变量时,用DW DW 或或DDDD将标号或变量的偏移地址或全将标号或变量的偏移地址或全地址来初始化存储器地址来初始化存储器(6 6)数据定义语句定义的变量的类型,在访问由此变量生成的新的操作数)数据定义语句定义的变量的类型,在访问由此变量生成的新的操作数时产生正确的目标代码。访问变量时操作数的类型与定义时的要一致。时产生正确的目标代码。访问变量时操作数的类型与定义时的要一致。3. 3. 分析和合成操作符。分析和合成操作符。分

23、析运算符分析运算符 用以分析提取一个存储器操作数的属性,如段、偏移量或类型等。用以分析提取一个存储器操作数的属性,如段、偏移量或类型等。 OFFSETOFFSET、SEGSEG、TYPETYPE、SIZESIZE、LENGTHLENGTH;OFFSETOFFSET 可以得到一个标号或变量的偏移地址可以得到一个标号或变量的偏移地址( (定位后已知定位后已知) ) MOV SIMOV SI,OFFSET DATA1 LEA SI, OFFSET DATA1 LEA SI, DATAlDATAl LEA SI, DATA1BX+100 LEA SI, DATA1BX+100 SEGSEG 可以得到一

24、个标号或变量的段值可以得到一个标号或变量的段值 MOV AXMOV AX,SEG ARRAYSEG ARRAY MOV DS MOV DS,AXAXF4.3汇编语言的伪指令语句汇编语言的伪指令语句TYPETYPE 结果结果= =类型数值(与存储器操作数类型属性的对应)类型数值(与存储器操作数类型属性的对应) B-1B-1;W-2/DD-4/NEAR-W-2/DD-4/NEAR-(-1-1)/FAR/FAR(-2-2) n DUP n DUP(?)(?)=?=?VAR DW VAR DW ?;?;变量变量VARVAR的类型为字的类型为字 2 2ARRAY DD 10 DUPARRAY DD 10

25、 DUP(?);(?); 变量变量ARRAYARRAY的类型为双字的类型为双字: :type ARRAY= 4type ARRAY= 4STR DB This is a testSTR DB This is a test;变量变量STRSTR的类型为字节的类型为字节 1 1 : MOV AXMOV AX, TYPE VAR TYPE VAR;(AXAX)2 2MOV BXMOV BX, TYPE ARRAY; TYPE ARRAY;(BXBX)4 4MOV CX,MOV CX,TYPE STRTYPE STR ; ; (CX) (CX) 1 1F4.3汇编语言的伪指令语句汇编语言的伪指令语句L

26、ENGTH LENGTH 一个变量一个变量DUPDUP定义的变量总数定义的变量总数 非非DUPDUP则则=1 =1 (LENGTH ARRAY=10LENGTH ARRAY=10)SIZE SIZE 一个变量第一个一个变量第一个DUPDUP定义的字节总数定义的字节总数 (变量(变量TYPETYPE* *LENGTHLENGTH) 非非DUPDUP则则= =TYPE TYPE 例例 V1 DB V1 DB 20 DUP20 DUP(?)(?),2020,100H DUP100H DUP(AA) V2 DD 4000H V2 DD 4000H SIZE V1SIZE V120 SIZE V2=42

27、0 SIZE V2=4K1 DB 4 DUP(0)K1 DB 4 DUP(0)K2 DW 10 DUP(?)K2 DW 10 DUP(?)K3 DD 1,2,3K3 DD 1,2,3BB:MOV AL,LENGTH K1BB:MOV AL,LENGTH K1 MOV BL,LENGTH K2 MOV CL,LENGTH K3 BB:MOV AL, 4 MOV BL,10 MOV CL,1F4.3汇编语言的伪指令语句汇编语言的伪指令语句合成运算符合成运算符 可规定存储器操作数的某个属性,例如类型。可规定存储器操作数的某个属性,例如类型。 PTRPTR、THISTHIS、SHORT SHORT (

28、类似类型强制转换)类似类型强制转换) INC WORD PTR BX INC WORD PTR BX ADD BYTE PTR 1000H, 38H ADD BYTE PTR 1000H, 38HPTRPTR (强制)指定强制)指定MEMMEM操作数类型,不明或强制操作数类型,不明或强制 MOV AXMOV AX,BX-INC BYTE/WORD PTR BXBX-INC BYTE/WORD PTR BXTHISTHIS(同同C C中中UNIONUNION联合体)联合体) 同一变量区同一变量区,可按不同类型访问(,可按不同类型访问(BYTE/WORD/DWORDBYTE/WORD/DWORD)

29、 V1WV1WEQU THIS WORDEQU THIS WORDV1BV1BDB 10 DUPDB 10 DUP(?)(?)MOV AXMOV AX,(,(WORD PTRWORD PTR) V1B V1B ;强制转换(否则强制转换(否则WarningWarning或或ErrorError)SHORTSHORT 127/+128 127/+128 短标号短标号 JMP SHORT SLABLEJMP SHORT SLABLEF4.3汇编语言的伪指令语句汇编语言的伪指令语句三。程序分段伪指令三。程序分段伪指令 SEGMENT / ENDSSEGMENT / ENDS 逻辑段存储定位关系逻辑段存

30、储定位关系 SEGMENTSEGMENT 定位类型定位类型 ,组合类型,组合类型 ,类别类别. PARA (节ParagraphXXXX0H) BYTE (任意) WORD (偶数地址) PAGE (页256XXX00)四种定位类型四种定位类型: :确定段的边界定位(浮动确定段的边界定位(浮动预设为常量,相对关系预设为常量,相对关系LINKLINK)SEGMENT / ENDS SNAME SEGMENT 定位类型定位类型,组合类型组合类型,类别类别. NONE 不组合不组合(本段与其它段无联系,无说明时默认组合类型本段与其它段无联系,无说明时默认组合类型) PUBLIC 多个模块相同段名邻接

31、在一起,共用一个段地址多个模块相同段名邻接在一起,共用一个段地址 STACK 链接后为堆栈段,同链接后为堆栈段,同Public( 相同段名装配合一相同段名装配合一) 链接时自动初始化链接时自动初始化SS和和SP EXE文件装入时文件装入时SP初值初值=末指针末指针+1(栈底)(栈底) COMMON 公用公用 不同程序遇到同名时同一地址装入不同程序遇到同名时同一地址装入,覆盖重叠临时变量,以最长为界覆盖重叠临时变量,以最长为界 MEMORY 将本段放在被链接在一起的其他段后置于地址最高处,多个时取第一个,其余作将本段放在被链接在一起的其他段后置于地址最高处,多个时取第一个,其余作为为COMMON

32、AT 表达式表达式 定位在指定段基位置,为标号或变量赋予绝对地址,不能用来指定代码段。定位在指定段基位置,为标号或变量赋予绝对地址,不能用来指定代码段。 AT 2000H 起始物理地址起始物理地址20000H; 类别类别(名称名称 )决定装入顺序,顺序装入)决定装入顺序,顺序装入,相同类别连续装入成一块相同类别连续装入成一块(段段)常用的类别有常用的类别有STACK,CODE,DATA等。等。 ENDS -段结束段结束段寄存器说明伪指令段寄存器说明伪指令ASSUMEASSUME : ASSUME ASSUME 段寄存器名:段名段寄存器名:段名 ,段寄存器名:段名,段寄存器名:段名, 例如,例如

33、, ASSUME CSASSUME CS:CSEGCSEG,DSDS:DSEGDSEG告诉汇编程序:从现在开始,告诉汇编程序:从现在开始,CSCS寄存器对应寄存器对应CSEGCSEG段,段,DSDS寄存器对应寄存器对应DSEGDSEG段。段。注意:段使用设定语句是伪指令语句,它不能设置段寄存器的值,即段寄存器还没有指向对应注意:段使用设定语句是伪指令语句,它不能设置段寄存器的值,即段寄存器还没有指向对应的段。所以在程序中还需要通过指令语句来给数据段寄存器和附加段寄存器赋值。的段。所以在程序中还需要通过指令语句来给数据段寄存器和附加段寄存器赋值。P140 P140 例题例题3.3.组定义伪指令组

34、定义伪指令GROUPGROUP 将若干不同名的段集合成一个组,共用一个组名,使其装在同一个物理段中。将若干不同名的段集合成一个组,共用一个组名,使其装在同一个物理段中。 组名组名 GROUP GROUP 段名段名 ,段名,段名 组名是识别组的标志,表示组的起始地址。组名是识别组的标志,表示组的起始地址。4.地址指定伪指令地址指定伪指令ORG 作用:用来指定某条语句或某个变量作用:用来指定某条语句或某个变量 偏移地址。偏移地址。格式为:格式为:ORG 表达式表达式 ORG $+表达式表达式 则此数值表达式的值将作为下一条指令语句或变量的偏移地址。则此数值表达式的值将作为下一条指令语句或变量的偏移

35、地址。例:例:DATA SEGMENTORG 2 VAR1DB2,3,4 ORG$+3 ;此时此时 $=05H VAR2 DW1234H DATAENDS0203043412VAR1028VAR2程序计数器程序计数器$作用:字符作用:字符$的值为程序下一个所分配的存储单元的偏移地址。的值为程序下一个所分配的存储单元的偏移地址。例:例: DATA SEGMENT B1 DB 16 DUP(?) A1DB 10H,20H,30H CEQU $-A1 DATA ENDS 则则 $-A1=13H-10H=03H四。模块定义伪指令与通信伪指令四。模块定义伪指令与通信伪指令四。模块定义伪指令与通信伪指令四

36、。模块定义伪指令与通信伪指令1。模块定义伪指令。模块定义伪指令NAME/END 格式为:格式为: 取名字取名字 END 标号标号 ;结束;结束 格式为:格式为: ;指定所打印模块的标题指定所打印模块的标题 END 标号标号 ;结束;结束 整个模块的结束使用整个模块的结束使用 END 标出,当汇编器读到标出,当汇编器读到 END 时,它认为模块到此时,它认为模块到此就结束了。(通常使用就结束了。(通常使用END后跟模块开始处的标号。)后跟模块开始处的标号。): NAME 、TITLE 操作不是必须的。若省略,则将源文件名作为目标模块的操作不是必须的。若省略,则将源文件名作为目标模块的名字。名字。

37、 END 则必不可少。则必不可少。2。模块通信伪指令。模块通信伪指令 各 模 块 之 间 数 据 或 过 程 的 互 访 和 共 享 。 全 局 符 号 定 义 即 引 用 伪 指 令各 模 块 之 间 数 据 或 过 程 的 互 访 和 共 享 。 全 局 符 号 定 义 即 引 用 伪 指 令PUBLIC/EXTRN,PUBLIC 名字名字 ,名字名字 ;名字可以是标号,变量名,过程名;名字可以是标号,变量名,过程名/EXTRN 名字名字:类型类型 ,名字:类型名字:类型 ;类型为;类型为 DB DW DD NEAR FAR 等等一起配对使用一起配对使用五、五、 过程和宏定义伪指令过程和宏

38、定义伪指令 1。过程定义过程定义PROC/ENDP 和其它程序设计一样,和其它程序设计一样,8086/8088汇编程序设计有过程或子程序的设计方法。汇编程序设计有过程或子程序的设计方法。8086/8066汇编程序的过程从运行位置上分为近过程(汇编程序的过程从运行位置上分为近过程(NEAR)和远过程(和远过程(FAR),),其定义如下:其定义如下: 过程名过程名 PROC NEAR/FAR RET 过程名过程名 ENDP 其中:过程名由编程者任取;其中:过程名由编程者任取; 如果在过程定义中没有写明是如果在过程定义中没有写明是NEAR过程或过程或FAR过程,则汇编器将这个过程默认为过程,则汇编器

39、将这个过程默认为NEAR过程。用过程。用CALL 调用,调用, RET 返回。返回。 2.宏指令的定义宏指令的定义(为了在源程序中不重复书写多次要用到的程序为了在源程序中不重复书写多次要用到的程序,因此用宏指令来代替因此用宏指令来代替,汇编时产生所需的代码汇编时产生所需的代码)例:将对某一寄存器的移位操作定义为一个宏指令。例:将对某一寄存器的移位操作定义为一个宏指令。(1)SHIFT MACRO MOV CL,4 SHL AX,CL ENDM宏指令宏指令 SHIFT 将将AX左移左移4 次。次。(2)SHIFT MACRO CN MOV CL,CN SHL AX,CL ENDM则则 SHIFT

40、 4 ;将将AX左移左移4 位。位。 SHIFT 5 ;将将AX左移左移5 位。位。(3)SHIFT MACRO CN,R MOV CL,CN SHL R,CL ENDM则则 SHIFT 4 ,AX ;将将AX左移左移4 位。位。 SHIFT 2, BX ;将将BX左移左移2 位。位。(4)SHIFT MACRO CN,R,SD MOV CL,CN S & SD R,CL ;用用&将参数标注出来,以便替换将参数标注出来,以便替换 ENDM则则 SHIFT 4 ,AX ,HL ;将将AX左移左移4 位。位。 SHIFT 2,BX ,HR ;将将BX右移右移2 位。位。二二.宏指令

41、的使用宏指令的使用 使用宏指令时需要将形式参数用一一对应的实在参数替代。当实在参数个数多使用宏指令时需要将形式参数用一一对应的实在参数替代。当实在参数个数多于形式参数,忽略多余的形式参数。当实在参数个数少于形式参数,多余的形式参于形式参数,忽略多余的形式参数。当实在参数个数少于形式参数,多余的形式参数设为空白。数设为空白。 宏指令中的参数可以为:常数、寄存器、存储单元名、地址表达式以及指令的宏指令中的参数可以为:常数、寄存器、存储单元名、地址表达式以及指令的助记符或助记符的一部分。助记符或助记符的一部分。例:例:SHIFT MACRO R,CN MOV CL,CNSHL R,CLENDMDAT

42、A SEGMENTX DB 08HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA MAIN PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV BX,OFFSET XMOV AL,BXSHIFT AL,4RET MAINENDP CODE ENDSEND MAIN3.取消宏指令取消宏指令 伪指令伪指令PURGE 宏指令一经定义,在整个程序中有效,宏指令一经定义,在整个程序中有效,若宏指令名与指令或伪指令助记符相若宏指令名与指令或伪指令助记符相同,则宏指令优先级更高。同,则宏指令优先级更高。 若出现了

43、这种情况,应在一定时取消宏指令,使失效的指令或伪指令恢复功若出现了这种情况,应在一定时取消宏指令,使失效的指令或伪指令恢复功能。能。格式如下:格式如下: PURGE , ,宏与过程的区别宏与过程的区别(重复执行的程序不长重复执行的程序不长,重复次数较多重复次数较多,用宏用宏. 程序长程序长,重复次数少重复次数少,用子程序用子程序)(1 1)宏在)宏在编译时编译时完成扩展,过程调用是在完成扩展,过程调用是在程序执行时程序执行时完成的。完成的。(2 2)宏可以)宏可以直接传递参数和接收参数直接传递参数和接收参数,不需要通过堆栈等媒介来进行。因此编程比较容,不需要通过堆栈等媒介来进行。因此编程比较容

44、易。而过程不能直接带参数,当过程之间需要传递参数时,易。而过程不能直接带参数,当过程之间需要传递参数时,必须通过堆栈,寄存器或存储必须通过堆栈,寄存器或存储器进行。器进行。(3 3)宏)宏只能简化源程序只能简化源程序的书写,而的书写,而没有缩短目标代码的长度没有缩短目标代码的长度。而过程调用能够缩短源程。而过程调用能够缩短源程序目标代码的长度,节约内存。序目标代码的长度,节约内存。(4 4)宏操作)宏操作不会在执行目标代码时增加额外的时间开销不会在执行目标代码时增加额外的时间开销。而。而过程过程调用涉及现场和断点的调用涉及现场和断点的保护和恢复,因而保护和恢复,因而有额外的时间开销有额外的时间

45、开销。延长目标程序的执行时间。延长目标程序的执行时间。列表伪指令和条件汇编伪指令列表伪指令和条件汇编伪指令列表文件(列表文件(.LST.LST)原程序与目标程序对照形式给出汇编结果原程序与目标程序对照形式给出汇编结果交叉列表文件(交叉列表文件(.CRE.CRE)按字母顺序列出源程序中所用的符号清单及其使用情况,并给)按字母顺序列出源程序中所用的符号清单及其使用情况,并给出他们在程序中的使用行号。出他们在程序中的使用行号。 TITLETITLE 给源程序指定一个标题给源程序指定一个标题 格式格式: : TITLE TITLE 标题行标题行 若标题行省略,若标题行省略, 则标题为空。则标题为空。

46、SUBTTLSUBTTL 给源程序指定一个副标题给源程序指定一个副标题 格式格式: : SUBTTL SUBTTL 副标题行副标题行 若副标题行省略,则副标题为空。若副标题行省略,则副标题为空。 PAGEPAGE 用于形成或定义列表文件每页的行列数。用于形成或定义列表文件每页的行列数。 格式格式: : PAGE PAGE 行数行数列数列数 若参数缺省,则从新的一页开始,并显示新页的标题、子标题及文件的其若参数缺省,则从新的一页开始,并显示新页的标题、子标题及文件的其余部分。余部分。条件伪指令条件伪指令条件伪操作格式条件伪操作格式: : IFIF 表达式表达式 程序块程序块1 1 ELSE EL

47、SE 程序块程序块2 2 ENDIF ENDIF当当IFIF指令中的表达式为指令中的表达式为真真时,被汇编的代码段是时,被汇编的代码段是程序块程序块1 1; ;当当IFIF指令中的表达式为指令中的表达式为假假时,被汇编的代码段是时,被汇编的代码段是程序块程序块2 2。 在一个条件结构中,仅有一个代码段被汇编,其它的则被忽略。在一个条件结构中,仅有一个代码段被汇编,其它的则被忽略。 汇编语言程序设计与其它语言的程序设计一样,都要有良好的数汇编语言程序设计与其它语言的程序设计一样,都要有良好的数据结构和算法,对每个要解决的问题要经过如下步骤:据结构和算法,对每个要解决的问题要经过如下步骤:根据问题

48、提出根据问题提出相应的算法或逻辑过程相应的算法或逻辑过程;( (建立建立数学模型数学模型并确定算并确定算法法) ) 根据已确定的算法或逻辑过程画出根据已确定的算法或逻辑过程画出程序流程图程序流程图,把解题的思路和,把解题的思路和逻辑逻辑 顺序以图示的方法表示出来。(画出流程图)顺序以图示的方法表示出来。(画出流程图)分配分配工作单元和寄存器工作单元和寄存器。编写程序代码,调试。编写程序代码,调试。程序的程序的是程序设计好坏的重要指标,汇编语言程序是程序设计好坏的重要指标,汇编语言程序运行效率的运行效率的衡量标准衡量标准:程序的执行时间。程序的执行时间。程序所占有的字节数程序所占有的字节数。有一

49、些计算机系统,可能应用于工业控制或工业过程。有一些计算机系统,可能应用于工业控制或工业过程检测,不需要过多的硬件资源,比如存储单元,所以就要求的程序有尽可能检测,不需要过多的硬件资源,比如存储单元,所以就要求的程序有尽可能少的字节数,以满足缩减硬件资源的要求。少的字节数,以满足缩减硬件资源的要求。程序的语句行数程序的语句行数。注:注:1 1、突出汇编的特色:突出汇编的特色:合理组织数据,充分发挥内部寄存器的作用,突出汇编合理组织数据,充分发挥内部寄存器的作用,突出汇编语言在语言在执行速度快、占用存储空间少和易于实现对硬件控制等优点执行速度快、占用存储空间少和易于实现对硬件控制等优点。 2 2、

50、采用、采用结构化结构化和和模块化模块化的设计方法,使每个模块都由基本结构程序顺序组的设计方法,使每个模块都由基本结构程序顺序组成。成。 写好注释和程序文档,便于阅读,测试,维护和交流,移植及连接和共写好注释和程序文档,便于阅读,测试,维护和交流,移植及连接和共享。享。例例1:将一个字节乘以:将一个字节乘以128我们可以通过:我们可以通过: MOV AL, DATA MOV BL, 128 MUL BL也可以通过也可以通过 MOV AL,DATA MOV CL,7 SHL AL,CL来完成。来完成。 例例2:数:数AL中的中的“1”的个数:的个数:程序程序1: MOV AH, 0 MOV CX,

51、 8 AGAIN: SHL AL, 1 JC ADD1 JMP NEXT ADD1: INC AH NEXT: LOOP AGAIN HLT程序程序2: MOV AH, 0 CLC ;CF置置0 AGAIN: SHL AL, 1 ADC AH, 0 OR AL, AL JNZ AGAIN HLT 直线程序设计直线程序设计是程序设计中最简单的设计方法,它是将确定好的算法或逻辑是程序设计中最简单的设计方法,它是将确定好的算法或逻辑关系以正确的语句和正确的逻辑关系有序地编写出来,形成程序。关系以正确的语句和正确的逻辑关系有序地编写出来,形成程序。语句1语句2语句3语句n例例1 1:表达式程序:表达式

52、程序编程计算编程计算Z=Z=(x x* *x-3y)/2x-3y)/2。设设X X、Y Y为单字节正整数,结果为单字节正整数,结果Z Z用二用二个字节来存放。个字节来存放。DATASEGMENTXDB25YDB32ZDW?DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATAEXPREPROCFARSTART: PUSH DSSUB AX,AXPUSH AX MOV AX,DATA MOV DS,AX MOV AL,X MUL AL ; x*xAXMOV BL,YADD BL,BL ; 2yBLADD BL,YSUB AX,BX ;x*x-3yAXSHR AX,1

53、; /2MOV Z,AXRETEXPRE ENDPCODE ENDSEND START2.2.查表程序查表程序(可参看书中(可参看书中P165P165例例4.554.55) 利用查表法求利用查表法求Y=XY=X* *X X* *X X。设设X X为为0-60-6之间的数,存放在之间的数,存放在XVALXVAL单元,单元,结果结果Y Y存入存入YVALYVAL单元,立方表从单元,立方表从TABLETABLE单元开始存放。单元开始存放。DATASEGMENTTABLEDB 0,1,8,27,64,125,216XVALDB 6YVAL DB ?DATA ENDSSTACK SEGMENT PARA

54、 STACK STACKDB 50 DUP(?)(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: PROC FAR PUSH DS MOV AX,0 PUSH AX ;标准序标准序 MOV AX,DATA MOV DS,AX ;初始化初始化DS MOV BX,OFFSET TABLE MOV AH,0 MOV AL,XVAL ADD BX,AX ;XLAT代替左边两句代替左边两句 MOV AL,BX MOV YVAL,AL RETSTART ENDPCODE ENDS END START例例3 3 将将ASCIIASC

55、II码码5858表示的十进制数转换为机内二进制。表示的十进制数转换为机内二进制。设缓冲区起始地址为设缓冲区起始地址为BUF,BUF,转换后的数存放在转换后的数存放在XXXX单元中单元中 。 DOSSEG .MODEL SMALL .STACK 256 .DATABUF DW 58XX DB ? .CODESTART: MOV AX,DGROUP MOV DS,AX MOV CL, 10 MOV BX, BUF ;BX=3538 AND BH, 0FH ;BH=05H MOV AL,BH MUL CL ;AX=50 AND BL,OFH ;BL=8 ADD AL,BL ;AL=(58)B MOV

56、 XX,AL MOV AX,4C00H INT 21H END START分支结构分支结构 TEST AX, 1 JZ LYLN: .LY: . . 程序段程序段N 后继程序段后继程序段 Y条件条件NYIF THEN 分支结构分支结构 TEST AX, 1 JZ LYLN: . JMP L0LY: .L0: .程序段程序段 Y程序段程序段N 条条 件件后继程序后继程序 YNIF IF THEN THEN ELSE ELSE1.1.利用比较和转移指令实现利用比较和转移指令实现2.2.利用跳转表实现利用跳转表实现DATA SEGMENTX DB 3Y DB ?DATA ENDSCODE SEGME

57、NT ASSUME CS:CODE, DS:DATASTART: MOV AX, DATA MOV DS, AX MOV AL,X CMP AL,0 JGE BIGER MOV AL, 0FFH ; 小于时赋小于时赋-1 MOV Y,AL JMP NEXTBIGER: JE EQUL MOV AL,1 ; 大于时赋大于时赋1 MOV Y,AL JMP NEXTEQUL: MOV Y,AL ;等于时直接输出;等于时直接输出NEXT: MOV AH, 4CH INT 21HCODE ENDS END START例例1 :有一数学函数如下:有一数学函数如下: 1 x0 y=f(x)= 0 x=0 -

58、1 x0 X取值范围:取值范围:-128+127 要求写出程序完成要求写出程序完成上述计算。上述计算。 对于程序中对于程序中多次、有规律执行多次、有规律执行的部分,通常使用循环结构重复运行的部分,通常使用循环结构重复运行这些部分,使程序有较高的运行效率和可读性。循环结构主要由这些部分,使程序有较高的运行效率和可读性。循环结构主要由三部分组三部分组成成,它们是:,它们是: 1. 1. :重复运行的部分,包含了工作部分和循环控制部分。:重复运行的部分,包含了工作部分和循环控制部分。工作部分进行相应的操作,而循环控制部分则保证在不满足循环条件时,工作部分进行相应的操作,而循环控制部分则保证在不满足循

59、环条件时,跳出循环。跳出循环。 2. 2. :在循环体中包括了循环结束条件运算部分。每:在循环体中包括了循环结束条件运算部分。每循环一次除了工作部分进行相应的操作外,循环条件部分还要通过运算,循环一次除了工作部分进行相应的操作外,循环条件部分还要通过运算,得出当前循环的状态,以便在适当的条件下结束循环。得出当前循环的状态,以便在适当的条件下结束循环。 3. 3. :用于设置开始循环时,循环体所处的初始状态,如:用于设置开始循环时,循环体所处的初始状态,如循环变量初值,循环体中用到的数据和地址指针循环变量初值,循环体中用到的数据和地址指针等。等。 循环结构DO-UNTIL初始化部分初始化部分循环

60、体循环体修改部分修改部分条件条件初始化部分初始化部分循环体循环体修改部分修改部分条件条件后继程序后继程序WHILE-DO例:例:计算计算1+2+3+100 MOV AX, 0 MOV BX, 0 MOV CX, 64HSUM:INC BX ADD AX, BX LOOP SUM 循环控制的方法:循环控制的方法:(1 1)计数控制计数控制: 循环次数已知,每循环一次加循环次数已知,每循环一次加/ /减减1 1;(2 2)条件控制条件控制:循环次数未知,须根据条件真假控制循环;:循环次数未知,须根据条件真假控制循环;(3 3)状态控制状态控制:根据事先设置或实时检测到的状态来控制循环;:根据事先设置或实时检测到的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论