![第四章汇编语言程序设计_第1页](http://file4.renrendoc.com/view/300d898094e8eacf11a1afc61c2d463c/300d898094e8eacf11a1afc61c2d463c1.gif)
![第四章汇编语言程序设计_第2页](http://file4.renrendoc.com/view/300d898094e8eacf11a1afc61c2d463c/300d898094e8eacf11a1afc61c2d463c2.gif)
![第四章汇编语言程序设计_第3页](http://file4.renrendoc.com/view/300d898094e8eacf11a1afc61c2d463c/300d898094e8eacf11a1afc61c2d463c3.gif)
![第四章汇编语言程序设计_第4页](http://file4.renrendoc.com/view/300d898094e8eacf11a1afc61c2d463c/300d898094e8eacf11a1afc61c2d463c4.gif)
![第四章汇编语言程序设计_第5页](http://file4.renrendoc.com/view/300d898094e8eacf11a1afc61c2d463c/300d898094e8eacf11a1afc61c2d463c5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微型计算机原理及应用郑猛北京理工大学光电学院
2023/1/1712023/1/172第四章汇编语言程序设计汇编语言程序设计是开发微机系统软件的基本技术,在程序设计中占有十分重要的地位。由于汇编语言具有执行速度快和易于实现对硬件的控制等独特的特点,至今仍得到广泛应用。特别是在对于程序的空间和时间要求很高的场合,以及需要直接控制设备的应用场合,汇编语言更是必不可少。内容提要程序设计语言概述8086/8088汇编语言的基本语法8086/8088汇编语言程序设计基本方法软件调试技术第四章汇编语言程序设计2023/1/1732023/1/174
4.1程序设计语言概述▲机器语言(MachineLanguage)
由二进制代码书写和存储的指令与数据。▲汇编语言(AssemblyLanguage)指令的助记符+符号地址+标号是机器语言的符号表示,是较低级的语言。
源程序利用汇编语言编写的程序,称源程序。不能被机器识别。
源程序的运行汇编程序翻译成二进制的浮动目标程序连接程序将目标文件与库文件相连,形成可执行程序可执行的程序在机器上直接运行▲高级语言:脱离具体机器、面向用户的通用语言,不依赖于计算机的结构和指令系统。可读性好,编程简单;
汇编语言:实时性能好,程序效率高,节省内存,运行速度快。2023/1/175
4.1程序设计语言概述例
编程实现c=a+b,并在屏幕上显示结果
#include"stdio.h"intmain(intargc,char*argv[]){inta,b,c;a=1; b=2;c=a+b;printf(“c=%d\n",c);return0;}编译后的目标文件达到3.59KB解1:用C语言实现2023/1/176
4.1程序设计语言概述例
编程实现c=a+b,并在屏幕上显示结果
解2:用汇编语言实现datasegmentadb?bdb?cdb?stringdb'c=$'dataendscodesegmentmainprocfarassumecs:code,ds:dataassumees:datastart:pushdssubax,axpushax
movax,datamovds,axmoves,ax
mova,1movb,2moval,aaddal,bmovc,alleadx,stringmovah,09int21haddc,30hmovdl,cmovah,2int21hmovdl,0ahint21hmovdl,0dhint21hretmainendpcodeendsendstart汇编后的目标文件只有208字节2023/1/177
4.28086/8088汇编语言的基本语法各种机器的汇编语言其语法规则不尽相同,但基本语法结构形式类似。现以8086/8088汇编语言为例加以具体讨论。4.2.18086/8088汇编源程序实例在具体讨论8086/8088汇编语言的语法规则之前,下面先举一个具有完整段定义格式的汇编源程序(即MASM程序)实例,以便对汇编语言的有关规定和格式有个初步了解。
例:求从1开始连续50个奇数之和,并将结果存放在名字为SUM的字存储单元中。2023/1/178
4.28086/8088汇编语言的基本语法4.2.18086/8088汇编源程序实例DATASEGMENT;定义数据段,DATA为段名SUMDW0;由符号(叫变量名)SUM指定的内存单元类型定义为一个字,初值为0DATAENDS;定义数据段结束STACKSEGMENTSTACK;定义堆栈段,这是组合类型伪指令,它规定在伪指令后须跟STACK类型名DB200DUP(0);定义堆栈段为200个字节的连续存储区,且每个字节的值为0STACKENDS;定义堆栈段结束CODESEGMENT;定义代码段ASSUMEDS:DATA,SS:STACK,CS:CODE;由ASSUM伪指令定义各段寄存器的内容。告诉汇编程序已定义的段地址要放在哪个对应的段寄存器。2023/1/179
4.28086/8088汇编语言的基本语法4.2.18086/8088汇编源程序实例START:MOVAX,DATA;数据段首址→DS
MOVDS,AX;
MOVCX,50;循环次数值→CX
MOVAX,0;清AX
MOVBX,1;BX置初值1NEXT:ADDAX,BX;累加奇数和,计50次
INCBX;求下一个奇数
INCBX
DECCX;循环计数器作减1计数
JNZNEXT;未计完50次时,转至NEXT循环
MOVSUM,AX;累加和送存SUM单元
MOVAH,4CH;DOS功能调用语句,机器将结束本
INT21H程序的运行,并返回DOS状态CODEENDS;代码段结束
ENDSTART;整个程序汇编结束2023/1/1710
4.28086/8088汇编语言的基本语法4.2.18086/8088汇编源程序实例汇编语言的格式
由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。每个语句由1~4个部分组成,其格式是:
[标号]指令助记符[操作数][;注解]标号:给指令或某一存储单元地址所起的名字。指令助记符:表示不同操作的指令,可以是8086的指令助记符。操作数:
指令执行的对象。依指令的要求,可能有一个、两个或者没有。注解:该项可有可无,是为源程序所加的注解,用于提高程序的可读性。2023/1/1711
4.28086/8088汇编语言的基本语法4.2.18086/8088汇编源程序实例段定义语句汇编源程序一般由若干段组成,每个段都有一个名字(叫段名),以SEGMENT作为段的开始,以ENDS作为段的结束,这两者(伪指令)前面都要冠以相同的名字。段从性质上可分为代码段、堆栈段、数据段和附加段4种,但代码段与堆栈段是不可少的(堆栈段可缺省,汇编程序会自动设置堆栈段),数据段与附加段可根据需要设置。(在上面这个例子中,一共定义了3个段:1个数据段,1个堆栈段,1个代码段) 段定义格式:
段名SEGMENT . .
段名ENDS例:
DATA
SEGMENT
SUM
DW0
DATAENDS2023/1/1712
4.28086/8088汇编语言的基本语法4.2.18086/8088汇编源程序实例
ASSUME是段定义伪指令,它用来定义源程序中的各个逻辑段,告诉汇编程序已定义的段地址将要放到哪个对应的段寄存器中。格式:ASSUME段寄存器名:段名
[,段寄存器名:段名]例 :ASSUMECS:CODE,DS:DATA,SS:NOTHING注意:CS不用赋值,由汇编程序赋值;
DS和ES要在程序中用指令赋值。ASSUME伪指令例:DATA SEGMENTSUM DW0DATA ENDSSTACK SEGMENTSTACKDB 200DUP(0)STACK ENDSCODE SEGMENTASSUMEDS:DATA,SS:STACK,CS:CODE START:MOVAX,DATA;
MOV DS,AX;2023/1/1713
4.28086/8088汇编语言的基本语法4.2.18086/8088汇编源程序实例伪指令:是一种说明性语句,它在汇编时只为汇编程序提供进行汇编所需要的有关信息,如定义符号、分配存储单元、初始化存储器等,而本身并不产生目标代码。
2000D0FFDATASEGMENTAADW20H,-30HDATAENDS3条伪指令定义了一个数据段,汇编时,将变量AA定义为一个字类型数据区的首地址20H-30H2023/1/1714
4.28086/8088汇编语言的基本语法4.2.18086/8088汇编源程序实例格式:
入口地址标号: (第一条要运行的指令) (主程序) (子程序)
... END 入口地址标号
编译程序根据开始和结束处的入口地址标号确定起始和结尾的地址,故两处的标号要求一致。程序起始地址例:START: MOV AX,DATA;
MOV DS,AX;
……CODE ENDS END START
2023/1/1715
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句汇编语言语句的种类和格式指令语句:是一种执行性语句,它在汇编时,汇编程序将为之产生一一对应的机器目标代码。伪指令语句:说明性语句,它在汇编时只为汇编程序提供进行汇编所需要的有关信息,本身并不生成目标代码。宏指令语句:是以某个宏名字定义的一段指令序列,在汇编时,凡有宏指令出现的地方都将用相应的指令序列的目标代码插入。宏指令语句是一般性指令语句的扩展。汇编指令机器码MOVDS,AX8ED8ADDAX,BX03C3
DATASEGMENTAADW20H,-30HDATAENDS1语句的种类在8086/8088汇编语言中,有3种基本语句:2023/1/1716
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句汇编语言语句的种类和格式2语句的格式指令语句格式:
[标号:]
[前缀]指令助记符[操作数表][;注释]标号:指令语句的符号地址,后面必须紧跟冒号“:”。标号可使用的字符为字母(A~Z,a~z)、数字(0~9)或某些特殊字符(@、一、?)等。第一个字符必须为字母或某些特殊字符,最大有效字符长度为31个字符(汇编程序仅识别前面31个字符)。标号可以省略,它经常作为表示转移的地址。特别注意:标号不能与机器保留字相同2023/1/1717
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句汇编语言语句的种类和格式2语句的格式指令语句格式:
[标号:]
[前缀]指令助记符[操作数表][;注释]前缀:8086/8088中有些特殊指令常作为前缀同其他指令配合使用,如和“串操作指令”(MOVS、CMPS、SCAS、LODS与STOS)连用的5条“重复指令”(REP、REPE/REPZ、REPNE/REPNZ),以及总线封锁指令LOCK等都是前缀。2023/1/1718
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句汇编语言语句的种类和格式2语句的格式指令语句格式:
[标号:]
[前缀]指令助记符[操作数表][;注释]指令助记符:
指令名称的代表符号,指出指令的操作类型。可译成机器码;不可省略,是关键字。操作数表:(由逗号分隔开的多个操作数)参与指令运算的数据。可以有一个、多个操作数或无操作数;操作数与指令助记符之间用“空格”隔开。操作数可以是常数、变量、标号、寄存器名或表达式。2023/1/1719
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句汇编语言语句的种类和格式2语句的格式伪指令语句格式:
[名字]伪指令助记符[参数表][;注释]名字:用符号地址表示,名字后不允许带冒“:”。通常是变量名、段名、过程名、符号名等。伪指令助记符:
常用的有变量定义语句(DB、DW)符号定义语句(EQU、=),段定义语句(SEGMENT…END),段分配语句(ASSUME),过程定义语句(PROC…ENDP)等。2023/1/1720
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句汇编语言语句的种类和格式2语句的格式伪指令语句格式:
[名字]伪指令助记符[参数表][;注释]操作数:不同伪指令有不同要求。操作数可以是常数、变量、字符串、表达式等注释:
功能和使用与指令性语句相同。接下来介绍各种汇编语言语句的有关语法规则2023/1/1721
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句
1.标号标号是可执行指令语句的地址的符号表示,可作为程序转向的目标地址。具有三个属性
(1)段地值:标号所在段的段基址。
(2)段内偏移量:标号所在地址与所在段的段首址之间的偏移地址字节数。
(3)类型:指在转移指令中标号可转移的距离,也称距离属性。类型NEAR,表示此标号为近标号,只能实现段内转移或调用;类型FAR,表示此标号为远标号,可以实现段间转移或调用。
注意:若标号后面紧跟冒号,表示隐含此标号距离属性为NEAR,也可用伪指令将此属性改为FAR。2023/1/1722
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句
2.操作数汇编语言中的操作数,可以是常量、寄存器、存储器、变量、标号或表达式。
常量——可作指令的立即数或伪指令的参数变量——主要作为存储器操作数汇编语言语句中的名字和标号具有逻辑地址和类型属性,主要用做地址操作数,也可以作为立即数和存储器操作数2023/1/1723
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句
2.操作数汇编语言中的操作数,可以是常量、寄存器、存储器、变量、标号或表达式。
常量——可作指令的立即数或伪指令的参数变量——主要作为存储器操作数汇编语言语句中的名字和标号具有逻辑地址和类型属性,主要用做地址操作数,也可以作为立即数和存储器操作数2023/1/1724
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式表达式是运算符将常量、变量和标号这3个基本形式的数据连接起来的运算式,它的求值是由汇编程序完成的。(3.1)
常量与数值表达式①数值常量A)16进制数(H)例:12H;0FAH(注意:A—F打头时前面加0)B)10进制数(D或缺省)C)2进制数(B)例:10010001B2023/1/1725
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.1)常量与数值表达式①数值常量D)当前指令地址($)例:
DATA SEGMENT
BUFFERDB32H,0AFH,10H,45H,00H,0FEH N1EQU$-BUFFER DATA ENDS START:…….……. MOVCX,N1;(N1的数编译后为6,用于循环次数)注:N1地址-BUFFER地址,计算出BUFFER数据区的大小,该值以符号赋值形式存入N1,编译后以立即数形式赋值。
2023/1/1726
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.1)常量与数值表达式②
字符串常量用单引号‘’括起来,汇编程序自动编译成ASCⅡ码。例:‘4AB’
→译成34H,41H,42H③符号常量预先给常量定义一个“名字”,在汇编语句中用该“名字”表示该常量。它的定义需用伪指令EQU或“=”例:ONEEQU1DATA1=2*12HMOVAX,DATA1+ONE把25H送AX2023/1/1727
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.1)常量与数值表达式④数值表达式分为算数运算符、逻辑运算符、关系运算符算术运算符包括:+,-,*,/,MOD(取余),SHL,SHR特点:①所有的算术运算符均可以对数据进行运算,运算对象与运算结果都是整数②若对地址运算,通常是在标号上加/减某一个数字量。2023/1/1728
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.1)常量与数值表达式④数值表达式例
数组ARRAY定义如下ARRAYDB1,2,3,4,5,6,7,8TRY DB 20指令为:MOVAX,30*5 MOVCX,(TRY-ARRAY)汇编时,计算表达式形成如下指令:
MOVAX,150 MOVCX,82023/1/1729
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.1)常量与数值表达式④数值表达式例汇编程序指令格式如下:
DA EQU 300 MOV AX,DA-80 MOV BX,DAMOD100 MOV CX,DA/100 MOV DH,01100100BSHR2汇编时,计算表达式形成指令为:
DA EQU 300 MOV AX,220 MOV BX,0 MOV CX,3 MOV DH,19H(00011001B)2023/1/1730
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.1)常量与数值表达式④数值表达式逻辑运算符AND(与)、OR(或)、NOT(非)、XOR(异或)注意:按位运算的,只能对常数进行运算,得到结果也是常数。例 MOV AL,NOT0FFH MOV BL,8CHAND73H(10001100BAND01110011B)
MOV AH,8CHOR73H(10001100BOR01110011B)汇编时,计算表达式形成指令为:
MOV AL,0 MOV BL,0 MOV AH,0FFH 2023/1/1731
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.1)常量与数值表达式④数值表达式关系运算符包括6种:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)。注意:关系运算符的两个操作数必须是数据,或是同一段内的两个存储单元的地址;若结果为真,输出全是1,即0FFH或0FFFFH;若结果为假,输出全是0。例MOVAX,10HGT16ADDBL,6EQ0110BMOVCX,((PORTLT5)AND100)OR((PORTGE5)AND200)汇编时,计算表达式形成指令为:
MOVAX,0ADDBL,0FFHMOVCX,100 ;当端口<5时2023/1/1732
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.2)变量与地址表达式①变量及其属性
汇编语言中,“变量”是内存中的一个数据区的名字,即数据所存放地址的符号。变量通常在数据段中定义,这样在程序中可多次使用。规定:变量由字母打头,最多31个字符。
变量定义语句作用:为变量分配内存和赋初值。格式:变量名助记符操作数,…,操作数;注释注意:变量的实际地址为存储该变量内存的第一个字节的地 址,编译链接后给出。2023/1/1733
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.2)变量与地址表达式②变量的定义
变量名——用符号表示,后面不跟冒号。汇编时将变量助记符后的第一个字节的偏移地址作为它的符号地址。助记符——所用伪指令助记符主要有:DB:用来定义字节; DW:用来定义字;DD:用来定义双字; DQ:用来定义四个字;DT:用来定义五个字(十个字节);格式:[变量名]数据区定义伪指令表达式功能:指定存储单元,以分配存储空间或存入操作数。2023/1/1734
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.2)变量与地址表达式②变量的定义
例:DA1DB10H,52H
;变量DA1中装入10H和52H例:DA2DW1122H,34H
;变量DA2中装入22H,11H,34H,00H例:DA3DD5*20H,0FFEE
;变量DA3中装入A0H,00H,00H,00H,EEH,FFH,00H,00H2023/1/1735
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.2)变量与地址表达式②变量的定义
例:操作数是字符串
DA1DB‘HELLO’(字符串‘HELLO’的ASCII码装入FIRST开始的存储单元)DA2DB‘OK’DA3DW‘OK’字节数:DA15BDA22BDA32BDW定义字符串只允许包含两个字符,否则必须用DB指令定义字符串,个数不超过255个2023/1/1736
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.2)变量与地址表达式②变量的定义
例操作数用?定义不确定值的变量,用作保留存储空间。
M1 DB? ;定义变量M1为不确定字节,保留1个字节空间
M2 DW0D55H,? ;定义变量M2第二个字为不确定,保留两个字节空间2023/1/1737
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.2)变量与地址表达式②变量的定义
例
操作数用DUP来定义重复变量
ONEDB5DUP(0);重复5个0存入ONE起始的存储单元
TWODW10DUP(?);重复10次,保留10个字的存储单元
THREEDB4DUP(1,2DUP(20H));DUP嵌套2023/1/1738
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.2)变量与地址表达式③地址表达式
例用地址表达式定义变量。已知变量PAR1,标号ADR2和ADR3,有定义为:
ONEDWPAR1 ;PAR1的偏移地址赋给字变量ONETWODWADR2 ;ADR2的偏移地址赋给字变量TWOTHREEDDADR3;ADR3的偏移地址和段基址赋给双字变量THREE设:PAR1,ADR2,ADR3在同一代码段CS=2000H中,其偏移地址分别为0100H,0200H,0300H。存储器中变量存放格式?2023/1/1739
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.2)变量与地址表达式③地址表达式例变量的类型属性可以通过属性操作符PTR来指定。
PTR用来说明某个变量、标号或地址表达式的类型属性。只在本语句有效,不永久改变变量属性。STR1DW? ;STR1定义为字类型 MOVAX,STR1;合法
MOVAL,STR1;非法MOVAL,BYTEPTRSTR1;合法例
N1DB15H,36HN2DW1122H,3344HLO:MOVAX,WORDPTRN1;使N1转换成字类型
MOVBL,BYTEPTRN2;使N2转换成字节类型也可用PTR来改变距离属性JMPFARPTRLOP在JMP语句中将标号LOP改为FAR,实现段间转移。2023/1/1740
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.3)运算符综述宏汇编中有5中运算符,算数运算符、逻辑运算符、关系运算符、分析运算符、合成运算符。下面介绍后两种①分析运算符分析运算符又叫取值运算符,用来把变量或标号分解为其组成部分(段地址、偏移值、类型、数据字节总数、数据项总数等),并以数值形式回送给变量或标号。2023/1/1741
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.3)运算符综述①分析运算符包括:SEG、OFFSET、TYPE、SIZE、LENGTH、HIGH、LOW。功能:加在变量或标号前,返回运算对象的某个参数值。例如偏移地址值、段地址值、类型属性、变量包含的单元数等。2023/1/1742
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.3)运算符综述①分析运算符SEG
格式:SEG变量或标号功能:汇编结果将回送变量或标号的段地值。例 MOV AX,SEGM1 MOV DS,AX设:M1是段名为DATA的数据段中的一个变量名;如DATA段从0500H开始,汇编后指令变为:
MOV AX,0500H MOV DS,AX2023/1/1743
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.3)运算符综述①分析运算符OFFSET
格式:OFFSET变量或标号功能:返回标号或变量的偏移地址值。
例若DA1为数据段中一个变量名
MOVBX,OFFSETDA1;等价于LEABX,DA12023/1/1744
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.3)运算符综述①分析运算符TYPE
格式:TYPE变量或标号功能:加在变量前,返回变量的类型属性;加在标号前,返回标号的距离属性。-1[FFH]-2[FEH]NEARFAR标号DBDWDDDQ类型1248返回值
变量例
A1 DB20H,30H A2 DW0438H A3 DD?L1: MOV AH,TYPEA1 MOV BH,TYPEA2 ADD AL,TYPEA3 MOV BL,TYPEL1汇编时,计算表达式形成指令为:
MOV AH,1 MOV BH,2 ADD AL,4 MOV BL,0FFH2023/1/1745
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.3)运算符综述①分析运算符LENGTH
格式:LENGTH变量或标号功能:当变量中使用DUP时,LENGTH返回此变量所包含的单元数,对其它变量则返回1。例M1 DW100DUP(?)M2 DW1,2,3MOVCX,LENGTHM1MOVBL,LENGTHM2汇编时,计算表达式形成指令为:
MOV CX,100 ;返回变量所包含的100个字单元
MOV BL,12023/1/1746
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.3)运算符综述①分析运算符SIZE
格式:SIZE变量或标号功能:加在变量前,返回该变量包含的总字节数。SIZE=LENGTH*TYPE。例对上例定义的M1,M2,M3 MOV CX,SIZEM1(M1 DW100DUP(?)) MOV BL,SIZEM2(M2DW1,2,3)汇编时,计算表达式形成指令为:
MOV CX,200;返回变量所包含的200个字节单元
MOV BL,2
2023/1/1747
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.3)运算符综述①分析运算符例:设DS=0200H,从偏移量为0000H定义以下变量:DA1DW1234H,5678HDA2DD5DUP(1,2)
……….MOVAX,OFFSETDA1MOVAX,OFFSETDA2MOVAX,SEGDA1L1:MOVAX,TYPEDA2MOVAX,TYPEL1MOVAX,LENGTHDA1MOVAX,SIZEDA2MOVAX,4MOVAX,0FFFFHMOVAX,1MOVAX,20汇编时MOVAX,0000HMOVAX,0004HMOVAX,0200H汇编时2023/1/1748
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.3)运算符综述②合成运算符PTR格式:类型/距离PTR变量或标号功能:将PTR左边的类型属性赋给右边的变量或标号。注意:PTR本身不分配存储单元,仅对已分配的存储单元赋予新的属性;常与类BYTE、WORD、NEAR、FAR等连用。例:在数据段中已定义了变量VA1DW?;
在程序中使用变量VA1时,MOVVA1,AX;合法
而MOVVA1,AL;非法(出现类型不匹配错误)
可以通过PTR指明是存入字节单元还是字单元。
MOVBYTEPTR[BX],10H;[BX]10HMOVWORDPTR[BX],10H;[BX],[BX+1]0010HMOVBYTEPTRVA1,AL;合法(用类型说明符修改了数据类型)2023/1/1749
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句指令语句3.表达式→(3.3)运算符综述②合成运算符THIS格式:变量/标号EQUTHIS类型/距离功能:将EQUTHIS右边的类型/距离属性,赋给左边的变量/标号,该变量或标号的段地址和偏移地址与下一个存储单元的地址相同。例 FIRST EQUTHISBYTE TABLEDW200DUP(?)FIRST的偏移地址值与TABLE的偏移地址值相同,区别在于FIRST变量为字节类型,TABLE为字类型。2023/1/1750
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句在汇编时进行处理,主要完成变量定义,段定义,段分配,指示程序开始和结束等功能。常用:数据定义(变量定义)语句:DB,DW,DD,DQ,DT符号定义语句:EQU,=,LABLE段定义语句:SEGMENT…ENDS段分配语句:ASSUME过程定义语句:PROC…ENDP程序开始、结束语句:ORG,END2023/1/1751
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句符号定义伪指令作用:对重复使用的数据、地址值、表达式可一次赋值,重复使用。格式:符号名EQU数或表达式 符号名=数或表达式例: A1EQU123 B1=246 C1EQUDS:[0005]EQU,“=”语句均不占内存EQU左边的符号不能重复定义EQU右若为标号或变量,必须先定义例:
LP1DB20DUP(?)LP2EQULP1+3;给LP2赋地址指针(LP1的第一个地址+3)注意:EQU赋值后,不能重新赋值;
=赋值后,可以重新赋值。例:X1=10
… X1=20(结果X1=20)2023/1/1752
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句符号定义伪指令例:若从数据段偏移地址为0000H开始定义如下语句:X1DB12H,34HX2EQU20X3DB56H,78H则:MOVAX,OFFSETX1;MOVAX,X2;MOVAX,OFFSETX3;MOVAX,OFFSETX2;问:AX的值分别是多少?
AX=0000HAX=14HAX=0002H(×)2023/1/1753
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句符号定义伪指令LABLE
功能:为当前存储单元定义一个指定类型的变量或标号。格式:变量名或标号名LABLE类型⑴LABEL与变量连用给下一个变量起一个别名,类型属性可修改成BYTE,WORD等。例DATB LABLEBYTE;DATB为DATW的别名,类型为字节DATWDW3031H,3233H ;DATW变量类型为字
MOV AL,DATB[0] ;31HAL MOVBX,DATW[1] ;3233HBX例:ARRAY_BYTELABLEBYTE;为变量ARRAY_BYTE定义一个字节类型的数据区ARRAY_WORDLABLEWORD;为变量ARRAY_BYTE定义一个字类型的数据区⑵LABEL与标号连用给下一语句定义的标号取一个别名,可改变距离属性为FAR或NEAR。例 DISF LABELFAR DISN:MOV AX,[SI]DISF与DISN指向同一条指令,DISF是DISN的别名,但距离属性改为FAR,当其它代码段对它调用时,可以使用。2023/1/1754
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句段定义伪指令格式:段名SEGMENT[定位类型]
[组合类型]
[‘类别’]
…;一系列汇编指令段名ENDS功能:将一个逻辑段定义成一个整体。段名——是逻辑段的标识符,不可省略。它确定了逻辑段在存储器中的地址,SEGMENT和ENDS前的段名必须相同。SEGMENT…ENDS——是段定义的伪指令助记符,任何一个逻辑段必须以SEGMENT开始,ENDS结束,不可省略,并且必须成对出现,两者之间是本逻辑段的内容。SEGMENT……ENDS2023/1/1755
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句段定义伪指令⑴定位类型(AlignType)定位该段起始地址。定位类型参数主要有下面4种。①BYTE——指定该段起始地址定位在存储单元的任何字节地址。②WORD——指定该段起始地址定位在字的边界,即段的首地址必须是偶数。③PARA——指定定位段的起始地址必须在节(16的整数倍)的整数边界,参数缺省时,就当成PARA。④PAGE——指定该段起始地址定位在页的边界,即段的首地址必须是256的整数倍。SEGMENT……ENDS2023/1/1756
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句段定义伪指令SEGMENT……ENDS⑵组合类型(CombineType)指示连接程序如何将某段与其他段组合起来的关系,主要参数有6种。①NONE——该段与其它段不连接,各段独立,作为缺省参数。②PUBLIC——该段与其它段中用PUBLIC说明的同名段连接时,由低地址到高地址连接,组成一个逻辑段,运算时装入同一物理段中,使用同一段地址。③STACK——连接时,将具有STACK类型的同名段连接成一个大的堆栈,由各模块共享。运行时,SS和SP指向堆栈段的开始位置。容量为各个模块中所设置的最大堆栈段容量。2023/1/1757
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句段定义伪指令SEGMENT……ENDS⑵组合类型(CombineType)④COMMON——该段在连接时与其它模块中的同名段有相同的起始地址,采用覆盖的方式在存储器中存放,连接长度为各分段中最大长度。⑤
MEMORY——表示由MEMORY说明的段在连接时被放在所有的段的最后(高地址端),若有几个段都指出了MEMORY组合类型,其他段被认为是COMMON类型。⑥AT表达式——表达式的值即该段的段地址,连接程序将把该段装在由此段地址所指定的存储区。
2023/1/1758
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句段定义伪指令ASSUME用来定义源程序中的各个逻辑段,告诉汇编程序已定义的段地址将要放到哪个对应的存储器中。将逻辑段定义成代码段、数据段、堆栈段、附加段。用户可以设置多个逻辑段,但只允许4个逻辑段同时有效。ASSUMENOTHING取消前面由ASSUME所指定的段寄存器。例:ASSUMEES:NOTHING
2023/1/1759
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句段定义伪指令ASSUME注意:代码段和数据段是必须分配,附加段可以省略。对串指令,必须设置附加段作目标串基址用,附加段也可用来存放数据,增大数据段容量。ASSUME伪指令只将代码段的段地址自动装入CS寄存器中,而不能自动把其它段地址装入相应的段寄存器中,所以在代码段的开始要有一段初始化程序完成这一工作。堆栈段:将段地址送入SS寄存器外,还要将栈顶偏移地址置入堆栈指针寄存器SP中。ASSUME伪指令只是告知汇编程序有关段寄存器与段的关系,并没有给段寄存器赋予实际的初值,所以需要初始化段寄存器(即赋值)。2023/1/1760
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句段定义伪指令ORG格式:ORG表达式功能:给汇编程序设置位置指针,指定下面语句的起始偏移地址。表达式——给定的偏移地址值,表达式的计算结果必须是正整数。一般情况下段定义语句指出了段的起点,偏移地址为0,段内各语句或数据的地址由段地址开始依次类推可确定。当用户要求指定某条指令或数据为指定地址时,可用ORG语句来改变,ORG语句可放在程序的任何位置。例用ORG指定代码段地址
CODE SEGMENT
ORG 100H ASSUMECS:CODE,DS:DATA,……START: MOV AX,DATA ┇CODE ENDS2023/1/1761
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句例
ORG$+6;表示从当前地址跳过6个字节
ABCDW1,2,$+4,0AH,0DH,$+3设:ABC的偏移地址为1000H则:相当于ABCDW1,2,0AHDW0DH,伪指令语句段定义伪指令ORG1008H(1004H+4),100DH(100AH+3)ABC在内存中的存放结果如右图。2023/1/1762
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句符号定义伪指令过程也称作子程序。节省内存空间,便于进行模块化程序设计。格式:过程名PROC[类型];指令序列
RETN
过程名ENDP
功能:定义一个过程,主程序可以用CALL指令调用它。
过程名——过程的名字,不可缺省。类型——为NEAR或FAR。NEAR允许过程在段内调用;FAR允许过程在段间调用,NEAR为缺省使用。PROC…ENDP2023/1/1763
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句符号定义伪指令PROC…ENDPRETN——为过程内部的返回指令。过程内部至少有一条RET指令,可以在过程的任何位置,使过程返回到主程序。过程内部可以有多个RET,表示此过程具有多个返回出口(在不同条件下,从不同出口返回)。N为弹出值,N必须为正偶数,可以缺省。过程调用允许嵌套和递归调用。嵌套与递归的深度由堆栈段的容量决定。2023/1/1764
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句符号定义伪指令PROC…ENDP参数→主﹑子程序互相传递的信息(可以是信息本身或信息的地址),分两类:
入口参数→主程序提供给子程序以便加工处理的信息→原始数据.
出口参数→经子程序加工处理后送回给主程序的信息→处理结果.传递方式→为了传递参数,约定一种主子双方都能接受的参数传递方式(例如堆栈)主程序与子程序间的参数传递2023/1/1765
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句符号定义伪指令PROC…ENDP主程序与子程序间的参数传递(通过堆栈)
入口和出口参数都放在堆栈中—传递单元在SS段.调用前,入口参数由主程序送入堆栈,子程序从堆栈中取得这些参数进行处理,处理后的结果又送到堆栈中.返回主程序后,主程序从堆栈取得结果.
这种方法不占用公共寄存器,也无需另外开辟单元,但因为子程序的返回地址也在堆栈中,所以一定要小心计算参数与地址,否则出错.2023/1/1766
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句符号定义伪指令PROC…ENDP主程序与子程序间的参数传递(通过堆栈)子程序要进行计算处理,自然要使用一些寄存器。子程序执行后,某些寄存器的内容会发生变化。如果主程序在这些寄存器中已经存放了有用信息,则子程序返回后,主程序的运行势必因原存放信息被破坏而出错,所以要保护寄存器中内容不被破坏→保护现场;在子程序处理后,恢复寄存器的内容→恢复现场。保护现场﹑恢复现场的工作可以在主程序中完成,也可以在子程序中完成:2023/1/1767
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句符号定义伪指令PROC…ENDP(1)子程序中保护(一般用此法)→在子程序开始,将子程序用到的所有寄存器的内容保护起来,在返回之前恢复这些寄存器的内容。如:某子程序要用到AX﹑BX﹑CX,可用进栈﹑出栈实现保护与恢复现场.
PUSHAXPUSHBX保护现场
PUSHCX﹕子程序工作部分
POPCXPOPBX恢复现场(注:先进后出)
POPAXRET2023/1/1768
4.28086/8088汇编语言的基本语法4.2.28086/8088汇编语言语句伪指令语句符号定义伪指令PROC…ENDP(2)在主程序中保护与恢复→在调用前保护某些寄存器的内容,返回后再恢复。如:调用DEF子程序,主、子程序中均要使用AX,可用以下方法保护:
PUSHAX;保护现场
CALLDEFPOPAX;恢复现场子程序结构:保护现场→取入口参数进行加工处理→存结果至指定单元(作出口准备)→恢复现场→返回2023/1/1769
4.38086/8088汇编语言程序设计基本方法
与高级语言编程相似,编写汇编语言源程序也应当首先理解和分析题意与要求,选择适当的数据结构和算法,然后,再着手用汇编语言来实现。一个好的程序应该具备的特点:⑴程序结构模块化,程序易读,易调试及维护。⑵执行速度快。⑶占用内存空间小。接下来介绍8086/8088汇编语言程序设计基本方法2023/1/1770
4.38086/8088汇编语言程序设计基本方法常用四种程序结构:顺序结构,分支结构,循环结构,子程序结构。设计汇编语言源程序的基本步骤:⑴分析问题:抽象数学模型,确定实现算法。⑵绘制程序流程图。⑶分配存储空间、工作单元:分配数据段、堆栈段、程序段的位置,确定寄存器主要作用。⑷编写程序。⑸程序检查,上机调试。⑹程序运行,结果分析。
在DOS环境下的8086/8088汇编语言程序结束时,通常用DOS的4CH号中断调用,以便使程序控制返回DOS操作系统。
MOVAH,4CH INT21H2023/1/1771
4.38086/8088汇编语言程序设计基本方法基本程序设计顺序结构指令指针IP值线性增加,IP=IP+1分支结构指令指针IP值受标志位的影响而跳变影响标志位的指令CMP、TEST、JXX循环结构IP值受计数器CX中的值不为零而循环影响标志的指令DEC2023/1/1772
4.38086/8088汇编语言程序设计基本方法程序的层次模块结构源程序堆栈段代码段数据段初始化输入运算处理输出返回DOS数值运算非数值运算附加段2023/1/1773
4.38086/8088汇编语言程序设计基本方法4.3.1一个实例例:编程计算W=X+Y+24-Z,其中变量X、Y、Z均为32位数DATASEGMENTXDW19,86YDW3,25ZDW1987,325WDW2DUP(?)DATAENDSCODESEGMENT
ASSUMECS:CODEDS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,XMOVDX,X+2
ADDAX,YADCDX,Y+2ADDAX,24
ADCDX,0
SUBAX,ZSBBDX,Z+2MOVW,AXMOVW+2,DX
MOVAH,4CHINT21HCODEENDS
END
START
2023/1/1774
4.38086/8088汇编语言程序设计基本方法
为了节省系统程序员的编程工作量与优化程序结构,在DOS及BIOS中预先设计好了一系列的通用子程序,以便供DOS及BIOS调用。由于这种调用采用的是以中断指令INTn的内部中断方式(软件中断方式)进行的,所以常称为DOS及BIOS中断调用;又因为在一个中断服务程序中往往包含有多个功能相对独立的子程序,所以也将中断调用称为系统功能调用或中断功能调用。4.3.2DOS及BIOS中断调用2023/1/1775
4.38086/8088汇编语言程序设计基本方法4.3.2DOS及BIOS中断调用DOS(DiskOperationSystem)是磁盘操作系统,它包括4个核心程序:引导程序:负责将DOS内的程序装入内存程序:负责对I/O设备管理程序:负责对文件管理与若干服务功能程序:负责命令处理ROMBIOS(BasicInputandOutSystem)是基本I/O系统,它实际上是被固化在ROM芯片内的一组程序,为计算机提供最低级、最直接的硬件控制,是硬件与软件之间的一个接口,负责解决硬件的即时需求。2023/1/1776
4.38086/8088汇编语言程序设计基本方法4.3.2DOS及BIOS中断调用一、中断调用及中断服务子程序返回DOS及BIOS中断调用是为了节省编程工作量和优化程序结构,在DOS及BIOS中预先设计好了一系列的通用子程序,供DOS及BIOS调用。中断调用是一种内部中断方式,通过执行INTn指令,使CPU根据中断类型号(或向量号)“n”找中断向量表中第n项作为此服务程序的入口。INTn指令的功能:当前标志寄存器的内容压栈,保存TF(跟踪标志);TF←0,IF←0;当前断点的CS值压栈,当前IP值压栈;IP,CS←中断向量第n项的4字节内容。8086CPU,TF=1处于单步工作方式;否则,正常执行程序2023/1/1777
4.38086/8088汇编语言程序设计基本方法4.3.2DOS及BIOS中断调用一、中断调用及中断服务子程序返回
0~1FH,80H~F0H是ROMBIOS的中断向量号;
20H~3FH是DOS的中断向量号;
40H~7FH供用户备用。通常,一个中断服务程序有多种功能,对每一种功能用一个相应的编号表示,称为功能号。对应某一中断向量的某一功能,往往要指出其规定的输入参数,中断服务完毕后,服务程序会有相应的输出。中断向量分配2023/1/1778
4.38086/8088汇编语言程序设计基本方法4.3.2DOS及BIOS中断调用一、中断调用及中断服务子程序返回中断调用的步骤
①准备入口参数; ②功能号送AH; ③执行INTn命令。当中断服务子程序返回时,要执行IRET指令,其功能:
①栈顶弹出1个字到IP; ②栈顶弹出1个字到CS; ③栈顶弹出1个字到标志寄存器F。2023/1/1779
4.38086/8088汇编语言程序设计基本方法4.3.2DOS及BIOS中断调用二、DOS常用功能调用DOS的功能调用:指DOS为系统程序员和用户提供的一组常用子程序如何使用的问题;DOS规定用中断指令INT21H
作为进入各功能调用子程序的总入口,再为每个功能调用规定一个功能号以便进入相应各子程序的入口。(子程序的入口参数及出口参数在每个功能调用的说明中可以查到)所有DOS提供给用户的功能调用格式(包括ROMBIOS调用)都是一样的,一般分为4个步骤:在AH寄存器中设置系统功能调用号;在指定的寄存器中设置入口参数;用INT21H(或ROM-BIOS的中断向量号)指令执行功能调用;根据出口参数分析功能调用的执行情况。2023/1/1780
4.38086/8088汇编语言程序设计基本方法4.3.2DOS及BIOS中断调用1.返回DOS
向量号:21H功能号:4CH功能:使系统结束程序运行后返回DOS状态。
例 MOVAH,4CH;(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科技背景下的小学拼音与识字教学研究
- 教育领域中的嵌入式硬件应用分析
- 社会环境对员工了解及掌握紧急救援的影响及重要性
- 科技艺术在家庭装饰画作中的应用
- 设计思维科技产业创新的驱动力与案例分析
- 2024年焙烤食品项目资金申请报告代可行性研究报告
- 趣味数学课堂活动提升学生兴趣
- 2025年滨州职业学院高职单招语文2018-2024历年参考题库频考点含答案解析
- 现代科技助力小学生礼仪教育
- 2025年渤海船舶职业学院高职单招高职单招英语2016-2024历年频考点试题含答案解析
- 山东省泰安市2022年初中学业水平考试生物试题
- 受贿案例心得体会
- 人教A版高中数学选择性必修第一册第二章直线和圆的方程-经典例题及配套练习题含答案解析
- 图书馆学基础简明教程
- 毕业设计(论文)-液体药品灌装机的设计与制造
- 二年级下册数学教案 -《数一数(二)》 北师大版
- 税收流失论文-我国个人所得税税收流失问题及对策研究
- 银行内部举报管理规定
- 平面几何强化训练题集:初中分册数学练习题
- 项目奖金分配奖励制度和方案完整版
- 支气管镜试题
评论
0/150
提交评论