《微机原理与接口技术4章1.ppt》由会员分享,可在线阅读,更多相关《微机原理与接口技术4章1.ppt(78页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 第四章第四章 汇编语言程序设计汇编语言程序设计微机原理与接口技术微机原理与接口技术1 第四章 汇编语言程序设计主要内容v汇编语言程序的结构v汇编语言语句类型和组成v汇编语言程序设计24.14.1汇编语言程序及其开发方法(汇编语言程序及其开发方法(1 1)4.1.14.1.1汇编语言及汇编语言程序汇编语言及汇编语言程序机器指令机器指令/汇编语言汇编语言/高级语言高级语言1 1、机器指令机器指令:计算机最终能理解并执行的是二进制代码表示的机器语言指令。但用机器语言指令编写计算机最终能理解并执行的是二进制代码表示的机器语言指令。但用机器语言指令编写程序麻烦,不直观。程序麻烦,不直观。例如例如:PU
2、SH AX PUSH AX 机器指令为机器指令为:01010000010100002 2、汇编语言汇编语言:以助记符的形式表示的机器语言指令称为汇编语言指令简称汇编语言,以助记符的形式表示的机器语言指令称为汇编语言指令简称汇编语言,它与机器指令是它与机器指令是一一对应的一一对应的。3 3、高级语言高级语言:面向过程面向过程(如如C,FORTRAN)C,FORTRAN)或对象或对象(如如C+,Java)C+,Java)的语言,不依赖于机器,因而有很好的的语言,不依赖于机器,因而有很好的通用性和可移植性通用性和可移植性机器语言指令、汇编语言指令及汇编语言源程序机器语言指令、汇编语言指令及汇编语言源
3、程序内存地址内存地址机器语言指令机器语言指令汇编语言源程序汇编语言源程序。149CH:1000HB84433MOV AX,3344H149CH:1003HBB789AMOV BX,9A78H149CH:1003H01D8ADD AX,BX。3 汇编语言与高级语言的比较汇编语言与高级语言的比较 汇编语言对机器的依赖性很大,在一种机器上使用的汇编语言程序很汇编语言对机器的依赖性很大,在一种机器上使用的汇编语言程序很难直接搬到另一种不同类型的机器上使用。难直接搬到另一种不同类型的机器上使用。特特 征征汇编语言汇编语言高级语言高级语言目标程序运行时间目标程序运行时间短短长长程序运行时占用的存储空间程序
4、运行时占用的存储空间小小大大直接访问硬件的能力直接访问硬件的能力强强弱弱程序可读性和可维护性程序可读性和可维护性差差强强程序开发的复杂程序程序开发的复杂程序高高低低程序的可移植性程序的可移植性差差强强对对硬件环境和软件的兼容性硬件环境和软件的兼容性差差强强4.1汇编语言程序及其开发方法(2)4 4.1汇编语言程序及其开发方法(3)4.1.24.1.2汇编语言程序的开发方法汇编语言程序的开发方法1.1.编写汇编语言源程序编写汇编语言源程序 源程序文件要以源程序文件要以ASMASM为扩展名为扩展名源程序文件的形成(编辑)可以通过任何一个文本编辑源程序文件的形成(编辑)可以通过任何一个文本编辑器实现
5、器实现:如如DOSDOS中的全屏幕文本编辑器中的全屏幕文本编辑器EDITEDIT2.2.对源程序进行对源程序进行汇编汇编 汇编语言源程序文件必须经过名为汇编程序的软件翻译成二进制目标代码文件,该目汇编语言源程序文件必须经过名为汇编程序的软件翻译成二进制目标代码文件,该目标代码文件主要包含源程序中的汇编语言指令代码所对应的机器语言指令代码。标代码文件主要包含源程序中的汇编语言指令代码所对应的机器语言指令代码。PCPC机上常用的汇编程序软件是机上常用的汇编程序软件是 MASN.EXEMASN.EXE。MASN HELLO.ASMMASN HELLO.ASM 经过汇编后的源程序,汇编成目标程序文件,
6、后缀为经过汇编后的源程序,汇编成目标程序文件,后缀为.objobj3.3.对目标程序进行对目标程序进行连接连接 生成的目标程序,还需要用连接程序软件(生成的目标程序,还需要用连接程序软件(LINK.EXELINK.EXE)将其与其他的目标程序及所需的)将其与其他的目标程序及所需的库文件组装成一个完整的可执行程序文件。库文件组装成一个完整的可执行程序文件。LINK HELLO.OBJLINK HELLO.OBJ54.1汇编语言程序及其开发方法(4)4.4.可执行程序的运行可执行程序的运行经汇编、连接生成的可执行程序在操作系统(DOS)下只要输入文件名就可以运行:hello.exe操作系统装载该文
7、件进入主存,并开始运行。在DOS下运行程序时,COMMAND.COM把.EXE文件装入内存。装入时在数据段内偏移地址0处构造一个100H字节的程序段前缀PSP,然后是代码段/数据段/堆栈段内容。装入后,自动设置DS和ES寄存器指向程序段前缀,CS、IP、SS、SP寄存器设置为由连接程序传过来的值(所以必须在程序中给DS、ES赋值)。5.5.调试程序调试程序 DEBUG HELLO.EXEDEBUG HELLO.EXEPSPDS,ES用用户户程程序序区区6 4.1汇编语言程序及其开发方法(5)v程序结束返回DOS的方法:程序一开始先把PSP的段地址(由DS指向)压栈,把偏移地址0压栈。程序结束时
8、RET指令使得:栈顶0000H-IP,PSP的段地址-CS,将要执行的指令是PSP里的内容,PSP里的前两个字节是指令INT 20H,是DOS中断调用,实现的功能就是“返回DOS”。START PROC FARPUSH DS MOV AX,0PUSH AX:RETSTART ENDP如果出现运行错误,如果出现运行错误,可以从源程序开始排错,可以从源程序开始排错,也可以利用调试程序也可以利用调试程序帮助发现错误帮助发现错误.采用采用DEBUG.EXEDEBUG.EXE调试程序:调试程序:DEBUG hello.exeDEBUG hello.exe7 文件名.ASM 文件名.OBJ 文件名.EXE
9、汇编语言汇编语言源程序源程序 汇编汇编目标目标程序程序连接连接执行执行/调试调试程序程序编辑程序编辑程序EDIT.EXE汇编程序汇编程序MASM.EXE连接程序连接程序LINK.EXE汇编语言程序的开发过程汇编语言程序的开发过程4.1汇编语言程序及其开发方法(汇编语言程序及其开发方法(6)ML 文件名文件名.ASM 84.24.2汇编语言源程序的结构(汇编语言源程序的结构(1 1)v汇编语言的源程序是分段的,由几个段形成一个源程序,每一段有一个段名,以SEGMENT为段开始,以ENDS结束;v源程序最后以END作结束;v一般有DATA段,CODE段,STACK段;v一个段由若干语句组成MY_D
10、ATA SEGMENT MY_DATA SEGMENT;定义数据段定义数据段SUM DB?SUM DB?;为符号为符号SUMSUM保留一个字节保留一个字节MY_DATA ENDS MY_DATA ENDS;数据段结束数据段结束MY_CODE SEGMENT MY_CODE SEGMENT;定义代码段定义代码段ASSUME CS:MY_CODE,DS:MY_DATAASSUME CS:MY_CODE,DS:MY_DATA;规定规定CS,DSCS,DS的内容的内容 PORT_VAL EQU 3 PORT_VAL EQU 3;端口的符号名端口的符号名GO:MOV AX,MY_DATA GO:MOV
11、AX,MY_DATA;DSDS初始化为初始化为 MY_DATAMY_DATA MOV DS,AX MOV DS,AX MOV SUM,0 MOV SUM,0 ;SUMSUM单元为单元为0 0CYCLE:CMP SUM,100 CYCLE:CMP SUM,100 ;SUMSUM与与100100比较比较 JNA NOT_DONE JNA NOT_DONE ;若未超过转至若未超过转至NOT_DONENOT_DONE MOV AL,SUM MOV AL,SUM ;若超过把若超过把SUMSUM的内容的内容 OUT PORT_VAL,AL OUT PORT_VAL,AL;通过通过ALAL输出然后停机输出然
12、后停机 HLTHLTNOT_DONE:IN AL,PORT_VAL NOT_DONE:IN AL,PORT_VAL;输入下一个字节输入下一个字节 ADD SUM,AL ADD SUM,AL ;与以前的结果累加与以前的结果累加 JMP CYCLE JMP CYCLE ;转至转至CYCLECYCLEMY_CODE ENDS MY_CODE ENDS ;码段结束码段结束END GO END GO ;整个程序结束整个程序结束94.24.2汇编语言源程序的结构(汇编语言源程序的结构(2 2)一、一、汇编语言的语句格式汇编语言的语句格式由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。在808
13、6/8088汇编语言中,有两类汇编语言语句:一类是执行性语句,另一类是说明性语句。对执行性语句,汇编程序都为之产生机器指令代码;而说明性语句的作用仅仅是告诉汇编程序对汇编程序中的执行性语句应该如何产生代码或如何分配存储空间。执行性语句可分为两种类型:一般性执行性语句和宏指令。一般性执行性语句对应一条8086/8088的机器指令,每个语句由14个部分组成,其格式是:标号:指令助记符 操作数;注解 说明性语句又称为“指示性语句”,通常用来表示源程序的起始或终止信息、分段情况、内存结构、变量说明等信息。名字 伪指令助记符 参数;注解其中用方括号括起来的部分,可以有也可以没有。每部分之间用空格(至少一
14、个)分开,一行最多可有132个字符.例:RET ;无操作数;无操作数COUNT:INC CX ;一个操作数;一个操作数COST DB 3,4,5,6,7;伪指令;伪指令,5个操作数个操作数MOV AX,BP十十4 ;二个操作数;二个操作数 104.24.2汇编语言源程序的结构(汇编语言源程序的结构(4 4)v1标号标号(名字名字):v是给指令或某一存储单元地址所起的名字。是给指令或某一存储单元地址所起的名字。可由下列字符组成:可由下列字符组成:v字母:字母:A z;数字:数字:0 9;v特殊字符:特殊字符:?、一、一、$。v数字不能作标识符的第一个字符数字不能作标识符的第一个字符,而圆点仅能用
15、作第一个字符。标识符最长为,而圆点仅能用作第一个字符。标识符最长为31个字符。当标识符后跟冒号时,表示是标号。它代表该行指令的个字符。当标识符后跟冒号时,表示是标号。它代表该行指令的起始地址起始地址;当标识符后不带冒号时,表示当标识符后不带冒号时,表示变量变量;伪指令前的标识符不加冒号。切记:不可与;伪指令前的标识符不加冒号。切记:不可与保留字相同(寄存器名称、指令助记符、伪指令等等)保留字相同(寄存器名称、指令助记符、伪指令等等)v2(伪伪)指令助记符指令助记符:v表示不同操作的指令表示不同操作的指令,可为,可为8088的指令助记符,或伪指令。的指令助记符,或伪指令。v3操作操作(参参)数数
16、:v是指令执行的对象。是指令执行的对象。依指令的要求,可能有一个、两个或者没有依指令的要求,可能有一个、两个或者没有.v4注解注解:v该项可有可无,是为源程序所加的注解,用于提高程序的可读性。该项可有可无,是为源程序所加的注解,用于提高程序的可读性。114.24.2汇编语言源程序的结构(汇编语言源程序的结构(3 3)二、汇编语言源程序的段定义 一般来说,一个完整的汇编源程序由3个段组成,即堆栈段、数据段和代码段。段定义伪指令可将源程序划分成若干段,以便生成目的代码和连接时将各同名段进行组合。段定义需用说明性语句(及段定义伪指令)来完成。段定义伪指令一般格式为:段名 SEGMENT 定位类型 组
17、合类型 类别 段名 ENDS SEGMENT和ENDS应成对使用,缺一不可。除段名外,其他可选。(1)定位类型:用来规定段起始边界的要求,可以为以下四种,缺省为 PARA)PAGE:16位段地址的最低8位必须为0,即从一页的起点开始。PARA:16位段地址的最低4位必须为0,即从一段的起点开始。WORD:16位段地址的最低1位必须为0,即从偶地址开始。BYTE:16位段地址可以为任意值,即段可以从任何字节开始124.24.2汇编语言源程序的结构(汇编语言源程序的结构(5 5)(2)组合类型(表示本段与其他段的关系,为连接程序使用,缺省为NONE):NONE:与其他段不发生关系,每段都有自己的基
18、地址PUBLIC:与其他同名同类别的段连接在一起,使用 一个共同的基地址STACK:与PUBLIC同样处理,但作为堆栈段COMMON:与其他同名同类别的段相互重叠在一起,使用一个共同的基地址AT表达式:把本段装在表达式值所指定的段地址上(值为16位;不能指定代码段)MEMORY:把本段定位在所有其他段之上,若有多个则只有连接时遇到的第一个有效,其余按COMMON处理)(3)类别名:为连接程序使用,把类别名相同的段放在连续的存储区间(一般有STACK、CODE、DATA)。134.24.2汇编语言源程序的结构(汇编语言源程序的结构(6 6)三、汇编语言的段寻址三、汇编语言的段寻址汇编程序必须知道
19、程序的段结构,并知道在指令执行时哪个段由哪个段寄存器指定,这个信息在代码段的开始由ASSEMU语句提供。格式:ASSUME 段寄存器:段名,段寄存器:段名,由于ASSUME伪指令只指明某一个段名对应于哪一个段寄存器,并没有包含将段地址送入该寄存器的操作。因此要将真实段地址装入段寄存器还需用汇编指令来实现。例如,CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MOV AX,DATA ;DATA段值送AX MOV DS,AX ;AX内容送DS,DS才有实际段值CODE ENDS 当程序运行时,由于DOS的装入程序负责把CS初始化成正确的代码段地址,SS初始
20、化为正确的堆栈段地址,因此用户在程序中就不必设置。但是,在装入程序中DS/ES寄存器由于被用作其它用途,因此,在用户程序中必须用两条指令对DS/ES进行初始化,以装入用户的数据段地址。144.24.2汇编语言源程序的结构(汇编语言源程序的结构(7 7)四、汇编语言结束语句END 汇编语言源程序最后一条语句为汇编语言结束语句END。END为一说明性语句(伪指令),汇编语言程序碰到它时将停止对源程序的汇编。END伪指令的一般格式:END 表达式 表达式表示汇编程序的起始执行地址。例如:END START ;表明该程序的启动地址为START。154.24.2汇编语言源程序的结构(汇编语言源程序的结构
21、(1010);title Hello World Program(hello.asm)Data segment ;Msg db HelloWorld!,0Ah,0Dh,$Data endsStacks segment stack stack dw 100h dup(?)Stacks endscode segment;Contains all codeassume cs:code,ds:data,ss:stacksorg 100hmain proc mov ax,data mov ds,ax mov ax,0900H mov dx,offset msg int 21H mov ax,4C00H;
22、int 21Hmain endpcode ends end main164.3常用伪指令(1)伪指令是说明性语句,用来对汇编语言程序进行控制,它一般不生成机器指伪指令是说明性语句,用来对汇编语言程序进行控制,它一般不生成机器指令代码,及不直接命令令代码,及不直接命令CPU去执行什么操作。去执行什么操作。一、符号定义伪指令一、符号定义伪指令1.等值语句EQU给符号定义一个值或别的符号名,或一条可执行的指令。在数据段中使用。例:NEW_PORT EQU 32;NEW_PORT的值为32 COUNT EQU CX ;COUNT被定义为CX寄存器 CBD EQU AAD一个符号一经EQU赋值后,不能重
23、新再定义。2.等号(Equal Sign)语句与EQU类似,使用它能对符号进行再定义。例:B1=6 ;B1定义为6 B1=10 ;B1重新定义为1017 4.3常用伪指令(2)二、数据定义伪指令二、数据定义伪指令 这类伪指令用来分配存储空间及定义所存数据的长度,同时也可对所分配的存储空间这类伪指令用来分配存储空间及定义所存数据的长度,同时也可对所分配的存储空间赋初值。赋初值。格式格式1 1:名字名字 伪指令名伪指令名 表达式表达式1,表达式,表达式2,这里这里伪指令可为伪指令可为DB,DW,DD,表达式有以下几种情况(名字是可选的)表达式有以下几种情况(名字是可选的)数值表达式数值表达式 例:
24、例:DA_BYTE DB 50H,50,0caH DA_WORD DW 0a3f1H,498dH A1 DD 12345H ;Memory:45H,23H,01H,00H?表达式,不带引号的?表示可预置任何内容,表示只用来分配(或定义)存储空间,但表达式,不带引号的?表示可预置任何内容,表示只用来分配(或定义)存储空间,但不对该空间初始化。不对该空间初始化。例:例:DA_B DB?,?;要求分配两个字节单元要求分配两个字节单元 DA_W DW?,?;要求分配两个字单元要求分配两个字单元 字符串表达式字符串表达式 数据项可以写成字符串形式,但只能用数据项可以写成字符串形式,但只能用DB、DW、D
25、D定义,而且定义,而且DW、DD语句定义的串只语句定义的串只允许包含两个字符。允许包含两个字符。18 例:S1 DB ABCDEF S2 DW AB,CD,EF S3 DD AB,CD 这几个变量在存储器中存放情况如下:S1 41H S2 42H S3 42H 42H 41H 41H 43H 44H 00H 44H 43H 00H 45H 46H 44H 46H 45H 43H 00H 00H 注意:定义多于两个以上字符的字符串时,只能使注意:定义多于两个以上字符的字符串时,只能使 用用DB伪指令,不能使用伪指令,不能使用DW和和DD等伪指令。等伪指令。19 4.3常用伪指令(3)当一个定义的
26、存储区域内的每个单元要放置同样的数据时,可用DUP操作符。格式2:名字 伪指令名表达式DUP(表达式)用于定义重复的数据或分配一数据块空间例:D_B1 DB 20H DUP(?);保留20H个字节 D_B2 DB 10H DUP(ABCD);字符串ABCD重复10H次 D_W1 DW 10H DUP(4);字4重复10H次 204.3常用伪指令(4)三、过程定义的伪指令PROC和ENDP在程序设计中,可将具有一定功能的程序段看成为一个过程(相当于一个子程序),它可以被别的程序调用。一个过程由伪指令PROC和ENDP来定义,其格式为:过程名 PROC 类型 过程体 RET 过程名 ENDP 其中
27、过程名是为过程所起的名称,不能省略,过程的类型由FAR(远过程,为段间调用)和NEAR(近过程,在本段内调用)来确定,如果缺省类型,则该过程就默认为近过程。ENDP表示过程结束。过程体内至少应有一条RET指令,以便返回被调用处。过程可以嵌套,也可以递归使用。214.3常用伪指令(5)四、定位伪指令ORG伪指令规定了在某一段内,程序或数据代码存放的起始偏移地址。一般格式:ORG 例如:DATA SEGMENT BUFF1 DB 23,56H,EOF ORG2000H BUFF2 DB STRING DATA ENDS 上述变量定义中,如果没有ORG 2000H这条语句的话,BUFF2是从BUFF
28、1 最后的数据EOF后存放,但有了ORG 2000H 这条语句,就会硬性的规定BUFF2 从DATA段偏移为2000H的单元开始存放。224.4常数、变量及标号(1)任何一个程序都要使用数据。汇编语言中的数据项有常任何一个程序都要使用数据。汇编语言中的数据项有常数、变量及标号三种类型数、变量及标号三种类型一、常数 二进制:10111001B 十进制:1234D或1234 八进制:255Q或255O 十六进制:3A5DH,第一位为字母时前面加数字0 字符串常数:用单引号括起来的一个或多个字符组成一个字符串常数,例如:The 在内存中以字符的ASCII码值存放,注意一个空格也是一个字符。如The,
29、在内存中是:54H、68H、65H和20H。23 4.4常数、变量及标号(2)二、变量:代表存放在某些存储单元的数据。这些数据在程序运行期间随时可以修改。变量有三个属性:段属性、偏移属性和类型属性(所具有的字节数)。三、标号 标号是一条指令的目标代码的符号地址,它常用作转移指令(或子程序调用指令)的操作数。标号有三个属性:段属性、偏移属性和类型属性。段属性是该标号的段地址,偏移属性是该标号的偏移地址,类型属性是表示该标号的范围是本段(NEAR)或段间(FAR),或称为近或远属性。24 4.5 汇编语言的表达式和运算符(1)一、表达式一、表达式 表达式是由运算符和操作符组成的序列,在汇编时将产生
30、一个确定的值。这表达式是由运算符和操作符组成的序列,在汇编时将产生一个确定的值。这个值可以仅表示一个常量,也可以表示一个存储单元的偏移地址。个值可以仅表示一个常量,也可以表示一个存储单元的偏移地址。二、运算符二、运算符 1、算术运算符、算术运算符 +、*、/、MOD(取余)、取余)、SHL(左移)、左移)、SHR(右移)右移)例:例:32 MOD 5 ;结果为结果为2 21H SHL 2 ;结果为结果为84H 2、逻辑运算符(按位操作)逻辑运算符(按位操作)AND(与与)24H AND 0FH=04H OR (或或)24H OR 0FH=2FH XOR(异或异或)24H XOR 0FH=2BH
31、 NOT(非非)NOT 24H =0DBH 25 4.5 4.5 汇编语言的表达式和运算符(汇编语言的表达式和运算符(2 2)3、关系运算符 关系运算是逻辑判定,当为真时结果为全1(0FFFFH),为假时结果为全0。EQ(等于);若PP=25,则25 EQ PP=0FFFFH NE(不等于);25 NE PP=0 LT(小于);25 LT 26=0FFFFH LE(小于等于);25 LE PP=0FFFFH GT(大于);26 GT PP=0FFFFH GE(大于等于);24 GE PP=0关系运算符一般不单独使用,常与其它运算符结合使用。例如:ADD AX,(port GT 60)AND 5
32、0)OR(port LE 60)AND 70)当port 的值大于60时,上述指令汇编为 ADD AX,50当port 的值小于或等于60时,上述指令汇编为 ADD AX,7026 4、取值运算符(1)SEG和 OFFSETSEG (求段地址),格式:SEG 符号名 OFFSET(求偏移地址),格式:OFFSET 符号名(2)TYPE操作符返回一个表示存储器操作数类型的数值。TYPE (求符号名类型值),格式:TYPE 符号名 (3)LENGTH 和SIZE 此两个操作符一般只适用于用DUP定义的存储器操作数。LENGTH,返回分配给指定存储器操作数元素的个数。格式:LENGTH 符号名 SI
33、ZE ,返回的是分配给该存储器操作数的总字节数。格式:SIZE 符号名 例如:K2 DW 10 DUP(0)则 LENGTH K2=10 SIZE K2 =20 对于用非DUP定义的存储器操作数,LENGTH返回值是1。类型byteworddwordNEARFAR类型值124-1(0FFFH)-2(0FFEH)4.5 4.5 汇编语言的表达式和运算符(汇编语言的表达式和运算符(3 3)27 (4)分离运算符HIGH与LOW 分别返回16位表达式的高位字节和低位字节 取低字节 格式:LOW 符号名 取高字节 格式:HIGH 符号名 例:设SSY=2050H mov AL,LOW 3080H ;A
34、L=80H mov AH,HIGH SSY ;AH=20H(5)$运算符 用于伪指令的参数字段时,返回汇编程序的汇编地址计数器的当前值;而当其用于指令中时,返回指令的首地址。例1:DATA SEGMENT BUFDB0123456789ABCD COUNTEQU$-BUF DATAENDS这里,COUNT的值就是数据区的长度,所以COUNT=14 4.5 4.5 汇编语言的表达式和运算符(汇编语言的表达式和运算符(4 4)28 4.5 4.5 汇编语言的表达式和运算符(汇编语言的表达式和运算符(5 5)例2 指令 JNE$+6,表示满足条件时转移到该指令的首地址加6以后所在的单元。1000:2
35、543 JNE$+6 则转移地址是2549H5、属性运算符 属性运算符用来给指令中的操作数指定一个临时属性。(1)PTR:定义符号名为新类型 格式:新类型或属性 PTR 符号名 PTR的功能归纳如下:保证运算时操作数类型的匹配 例:F1DB16H,38H F2DW1234H,26ABH MOV AX,WORD PTR F1;AX=3816H MOV BL,BYTE PTR F2;BL=34H29 4.5 4.5 汇编语言的表达式和运算符(汇编语言的表达式和运算符(6 6)通过PTR指明是字单元还是字节单元 例:MOVBYTE PTR BX,10H;BX为字节单元MOVWORD PTR SI,2
36、0H;SI为字单元 用PTR来改变距离属性 例:JMPFAR PTR LLOOP ;段间转移CALLDWORD PTR BX;远程调用(2)THIS 格式:符号名 EQU THIS 类型 例:LABC EQU THIS BYTE ;LABC是字节类型,其地址与LABD相同 LABD DW 4321H,2255H ;LABD是字类型 MOV AL,LABC ;AL=21H MOV AX,LABD ;AX=4321H30 4.5 4.5 汇编语言的表达式和运算符(汇编语言的表达式和运算符(7 7)(3)段超越运算符格式:段寄存器加冒号强迫当前指令的操作数的寻址不按约定的段进行,而由段超越运算符指定
37、的段寻址例:MOV AX,ES:BX;强迫操作数来自ES段(4)SHORT运算符通知汇编器,转移目标在+127-128之间例:JMP SHORT F131问题:例:FAR DB 23H,45H AAA:MOV AX,FAR例:MOV BX,OFFSET VAR1MOV BX,7常量和变量的名字及标号不能用宏汇编的保留字此此程序段汇编时会出现程序段汇编时会出现操作类型不明确操作类型不明确错误错误需要修改为需要修改为:MOV BYTE PTR BX,7;字节操作字节操作或或MOV WORD PTR BX,7;字操作字操作324.3.5基本结构程序设计程序设计步骤 1、分析问题 2、确定算法 3、画
38、流程图,简单程序也可以不画流程图,直接编程。4、内存空间分配 5、编写程序 6、静态检查 7、上机调试334.3.5基本结构程序设计1、顺序结构顺序结构程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP内容自动增加的顺序进行。例:用数据运算指令对两个16位数做加法,这两个数从地址10050H开始连续存放,结果放在这两个数之后。分析题目:16位数相加,用加法指 令,本题可以不考虑进位问题。确定算法:8086加法指令可以做字操 作,可以用不带进位的加法指 令;若用带进位加法指令,事 前先清除进位。画流程图:见右.开始 初始化 被加数送AX 被加数+加数送AX AX送(10054H)和(1
39、0055H)结束344.3.5基本结构程序设计内存空间分配:内存地址 内容10050H 被加数低8位10051H 被加数高8位10052H 加数低8位10053H 加数高8位10054H 和数低8位10055H 和数低8位编写程序:编写程序:movmovax,1000hax,1000h;初始化初始化movmovdsds,ax,axmovmovsisi,50h,50hmovmov didi,52h,52hmovmovbxbx,54h,54hclcclc ;清除进位清除进位movmovax,ax,sisi adcadcax,ax,didi;带进位加法带进位加法movmov bxbx,ax,axhl
40、thlt354.3.5基本结构程序设计2、分支结构分支程序的基本思想是根据逻辑判断的结果来形成程序的分支,如图,若A成立,则执行P1;否则执行P2。例:符号函数例:符号函数 1 1 当当X X0 0 Y=0 Y=0 当当X=0 X=0 -1 -1 当当X X0 0364.3.5基本结构程序设计DATASEGMENTXXDW 12;X存储单元YYDW?;Y存储单元DATAENDSSTACK SEGMENT STACK STACKDB 100H DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:PUSH DSXOR A
41、X,AXPUSH AXMOV AX,DATAMOV DS,AXMOV AX,XX ;AX XX374.3.5基本结构程序设计 CMPAX,0;X与0比较JGEBIGPR;X0,转BIGPRMOVYY,0FFFF;X0,(YY)-1JMPEXIT;退出BIGPR:JE EQUPR;X=0,转EQUPR MOVYY,1;X0,(YY)1JMPEXITEQUPR:MOVYY,0;X=0,(YY)0EXIT:MOV AX,YY;将结果送AXRET;MOVAX,4C00H;INT21HCODEENDSENDSTART38 例:比较两个无符号数的大小,把大数存入MAX单元 解:比较两个无符号数,可采用CF
42、标志位来判断大小,程序如下:DATASEGMENTSOURCEDBX1,X2;两个无符号数X1和X2MAXDB?;保留存放大数的单元DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATAMOVAX,DATAMOVDS,AXMOVAL,SOURCE;X1送ALCMPAL,SOURCE+1;X1-X2JNCBRANCH;若X1X2,转BRANCHMOVAL,SOURCE+1;否则,X2送ALBRANCH:MOVMAX,AL;大数送MAX单元 MOVAX,4C00H INT21HCODEENDSEND394.3.5基本结构程序设计3、循环结构循环程序是经常遇到的程序结构,
43、一个循环结构通常由以下几个部分组成:循环初始化部分。一般要进行地址指针、循环次数及某标志的设置,相关寄存器的清零等操作。只有正确地进行了初始化设置,循环程序才能正确运行,及时停止。循环体。是要求重复执行的程序段部分,对应于要求重复执行的操作。循环控制部分。由该部分修改并判断控制循环的条件是否满足。以决定是否继续循环。循环结束部分。如保存循环运行结果等。404.3.5基本结构程序设计循环程序有两种结构形式,一种是DOWHILE结构,另一种是DOUNTIL结构。前者把循环控制部分放在循环体的前面,先判断执行循环体的条件,满足条件就执行循环体,否则就退出循环,如图(2)所示。而后者则是在执行循环体之
44、后,再判断循环控制条件是否满足,若满足条件,则继续执行循环操作,否则,则退出循环,如图(1)所示。DOWHILE结构的循环程序,其循环体有可能并不执行,而DOUNTIL循环程序的循环体至少必须执行一次。DO-WHILEDO-UNTIL41 例:用循环结构编写程序完成:DATASEGMENTBUFFERDWa1,a2,a10 ;原始10个数据SUM DW?;存放和数DATAENDS CODESEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAX,0;AX中为和数,初始为0 MOVDI,OFFSET SUM;存放结果地址送DI MO
45、VBX,OFFSET BUFFER ;数据缓冲区首地址送BX 4.3.54.3.5基本结构程序设计基本结构程序设计424.3.5基本结构程序设计 MOV CX,10;循环次数送CX LOP:ADDAX,BX;累加 INCBX;修改数据缓冲区地址 INCBX DECCX;次数减1 JNZLOP;到10次了吗?不到,转LOP MOVDI,AX;到10次,存放结果和 MOVAX,4C00H;返回DOS INT21HCODE ENDS ENDSTART434.3.5基本结构程序设计例:给定一串16位数,找出大于零、等于零和小于零的个数,并紧跟着原串存放。分析:这是一个统计问题,须设定三个计数器分别统计
46、三种情况下的结果。程序如下:DATASEGMENTBUFF DW X1,X2,X3,XnCOUNT EQU$-BUFF ;此时,COUNT的值为BUFF所占的字节数PLUSE DB?ZERO DB?MINUS DB?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA BEGIN:MOVAX,DATA MOVDS,AX MOVCX,COUNT SHRCX,1 ;相当于除2,正好为BUFF中的数据个数44MOVDX,0 ;设定计数器初值MOVAH,0 ;设定计数器初值LEABX,BUFFAGAIN:CMP WORD PTR BX,0JAEPLU ;
47、大于等于0,则转PIUINCAH ;0,则统计JMPNEXTZER:INCDH ;0,则统计NEXT:INCBXINCBXLOOPAGAINMOVPLUS,DLMOVZERO,DHMOVMINUS,AHMOVAX,4C00HINT21HCODEENDSENDBEGIN454.3.5基本结构程序设计4、子程序子程序是程序设计中经常使用的程序结构,通过把一些固定的、经常使用的功能做成子程序的形式,可以使源程序及目标程序大大缩短,提高程序设计的效率和可靠性。对于一个子程序,应该注意它的入口参数和出口参数。入口参数是由主程序传给子程序的参数,而出口参数是子程序运算完传给主程序的结果。另外,子程序所使用
48、的寄存器和存储单元往往需要保护,以免影响返回后主程序的运行。参数传递一般有三种方法实现。(1)利用寄存器。这是一种最常见方法,把所需传递的参数直接放在主程序的寄存器中传递给子程序。(2)利用存储单元。这种参数传递方法,把所需传递的参数直接放在一个数据区中。(3)利用堆栈。这种方法将参数压入堆栈,在子程序运行时从堆栈中取参数。464.3.5基本结构程序设计例:两个6字节数相加。分析:将一个字节相加的程序段设计为子程序。主程序分6次调用该子程序,但每次调用的参数不同。DATASEGMENTADD1DBFEH,86H,7CH,35H,68H,77HADD2DB45H,BCH,7DH,6AH,87H,
49、90HSUMDB 6 DUP(0)COUNTDB6DATAENDSSTACKSEGMENTDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK474.3.5基本结构程序设计MADD:MOV AX,DATAMOV DS,AXMOV SI,OFFSET ADD1MOV DI,OFFSET ADD2MOV BX,OFFSET SUMMOV CX,COUNT ;循环初值为6CLCAGAIN:CALL SUBADD ;调用子程序LOOP AGAIN ;循环调用6次MOV AX,4C00HINT21H484.3.5基本结构程序设计;子程
50、序入口参数:SI,DI,BX。出口参数:SI,DI,BXSUBADDPROC ;完成一个字节相加MOV AL,SI ;SI是一个源操作数指针ADCAL,DI ;DI是另一个操作数指针MOV BX,AL ;BX是结果操作数指针INCSIINCDIINCBXRETSUBADDENDPCODEENDSEND MADD 494.3.5基本结构程序设计例:把内存中的字变量NUMBER的值,转换为4个ASCII码表示的十六进制数码串,串的起始地址为STRING。分析:把内存中的字变量NUMBER的值,转换为4个ASCII码表示的十六进制数码串的工作设计成一个子程序,在这个子程序中再调用另一个子程序,由它完