资源描述
,单击此处编辑母版标题样式,*,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,2025/5/19 周一,1,第,4,章,8086/8088,汇编语言,汇编程序功能,汇编语言中的标记,伪指令,汇编语言程序格式,汇编语言程序返回,DOS,的方法,汇编语言程序生成的可执行文件结构,2025/5/19 周一,2,本章内容简介,在学习了第,3,章指令系统的基础上,本章提供用汇编语言编写各种实用程序的必要基础,包括汇编程序的功能、汇编语言语句的格式、汇编语言程序的结构、常用伪指令的功能等知识。,学完本章后,我们就可以进行简单的汇编语言程序设计了。,2025/5/19 周一,3,4.1,汇编程序功能,汇编语言程序的建立及汇编过程,汇编程序的主要功能,检查出源程序的语法错误,并给出出错信息提示。,生成源程序的目标代码程序,也可给出列表文件。,汇编时遇到宏指令即展开。,2025/5/19 周一,4,汇编语言程序,汇编语言的基本思想是用一组字母、数字和符号来代替一条二进制码表示的指令,即用指令的助记符、符号地址、标号、伪指令等符号书写程序。,用这种汇编语言书写的程序称为汇编语言源程序。把汇编语言源程序翻译成在机器上能执行的机器语言程序(目标代码程序)的系统程序称为汇编语言。,2025/5/19 周一,5,汇编语言程序的处理过程,首先用编辑程序产生汇编语言的源程序,源程序是用汇编语言的语句编写的且不能为机器所识别的程序,所以要经过汇编程序加以翻译,因此汇编程序的作用就是把源文件转换成用二进制代码表示的目标文件(称为,OBJ,文件)。,在转换的过程中,如果源程序中有语法错误,则汇编结束后,汇编程序将指出源程序中的错误信息,如非法格式,未定义的助记符、标号,漏掉操作数等。,用户还可以用编辑程序来修改源程序中的错误,最后得到无语法错误的目标文件。,目标文件虽然已经是二进制文件,但它还不能直接上机运行,必须经过连接程序(,LINK,)把目标文件与库文件或其他目标文件连接在一起形成可执行文件(,EXE,文件),才可以在机器上运行。,2025/5/19 周一,6,4.2,汇编语言中的标记,保留字,分界符,数值表示,2025/5/19 周一,9,汇编语言中可以出现的常数,二进制数,数字后跟字母,b,,如,1011b,十进制数,直接写数字,如,217,八进制数,数字后跟字母,O,,如,126O,十六进制数,数字后跟字母,H,,如,2A0H,字符和字符串,包含在单引号或双引号内,如“,HELLO”HELLO,2025/5/19 周一,10,4.3,伪指令,伪指令语句又称为说明语句或管理语句。它不同于指令语句,不是直接命令,CPU,去执行某一操作,而是命令汇编程序应当如何生成目标代码。,例如控制汇编以实现数据定义、存储器分配、符号处理、模块之间的通信、源程序开始和指示程序结束等功能。,伪指令无相应的目标代码,因此也称为伪操作。伪指令格式与指令格式十分相似。,2025/5/19 周一,11,伪指令语句,表达式赋值伪指令,数据定义伪指令,LABEL,伪指令,段定义伪指令,过程定义伪指令,模块命名、程序开始和程序结束伪指令,模块通信伪指令,结构伪指令,STRUC,2025/5/19 周一,12,表达式赋值伪指令(,1,),EQU,伪指令,功能:给各种形式的表达式赋予一个名字,格式:表达式名,EQU,表达式,CR EQU 0DH ;,常数,A EQU ASCII-TABLE ;,变量,STR EQU 64*1024 ;,数值表达式,ADR EQU ES:BP+DI+5 ;,地址表达式,CBD EQU AAM ;,指令助记符,利用,EQU,伪指令,可以用一个名字代表一个数值,或用一个较简短的名字来代替一个较长的名字。,需要注意一个问题,,EQU,伪指令不允许对同一符号重复定义。,2025/5/19 周一,13,表达式赋值伪指令(,2,),“=”,伪指令,功能:与,EQU,类似,区别:,EQU,中表达式名不允许重复定义,而“,=”,允许重复定义。,2025/5/19 周一,14,数据定义伪指令(,1,),指令格式:,变量名,DB,表达式,变量名,DW,表达式,变量名,DD,表达式,2025/5/19 周一,15,1,DB,(,Define byte,),DB,定义的变量类型为,BYTE,,给变量分配字节或字节串。,DB,伪指令定义符后面的操作数每个占有,1,个字节。,2,DW,(,Define word,),DW,定义的变量类型为,WORD,。,DW,伪指令定义符后面的操作数每个占有,1,个字,即,2,个字节。在内存中存放时,低位字节在前,高位字节在后。,3,DD,(,Define double word,),DD,定义的变量类型为,DWORD,。,DD,后面的操作数每个占有,2,个字,即,4,个字节。在内存中存放时,低位字在前,高位字在后。,2025/5/19 周一,16,表达式可为如下几种情况:,常数表达式,不能超出范围,例如字节数据不能为,300,问号,(,?,),给变量保留相应的存储单元,而不赋与变量某个确定的初值。如:,SUM DB?,地址表达式,(,适用于,DW,和,DD),字符、字符串(适用于,DB,),重复子句,DUP,(表达式),当同样的操作数重复多次时,可用重复操作符“,DUP”,表示,其形式为:,n DUP(,初值,初值,),用逗号分开的上述各项,2025/5/19 周一,17,例,1,:,DAT1 DB 60h,8EH,DAT2 DW 550H,99H,DAT3 DD 7CEFH,画出内存数据分配示意图。,2025/5/19 周一,18,例,2,:定义一个包含,1-9,的平方值的内存表:,TABLE DB 1,4,9,16,25,36,49,64,81,画出内存数据分配示意图。,2025/5/19 周一,19,例,3,:操作数是字符串的情况:,STRING DB STUDENT,画出内存数据分配示意图。,2025/5/19 周一,20,例,4,:操作数用?保留空间,但不存入数据:,DAT1 DB,?,DAT2 DW 550H,?,1234H,画出内存数据分配示意图。,2025/5/19 周一,21,例,4,:操作数用,DUP,重复子句:,DAT1 DB 10 DUP(2),DAT2 DB 100 DUP(?),DAT3 DB 3 DUP(12,3AH,78),画出内存数据分配示意图。,2025/5/19 周一,22,段定义伪指令(,1,),格式:段名,SEGMENT ,定位类型,组合类型,类别,语句体(段体),段名,ENDS,2025/5/19 周一,23,ASSUME,伪指令,它是用来说明逻辑段和物理段关系的伪指令,即告诉汇编程序在指令执行期间内存的哪一段是数据段,哪一段是堆栈段,哪一段是代码段。,ASSUME,段寄存器名,:,段名,段寄存器名,:,段名,例如:,ASSUME CS:CODE,DS:DATA,ASSUME CS:A,DS:B,ES:C;SS:D,2025/5/19 周一,24,过程定义伪指令(,1,),格式:过程名,PROC ,类型,过程体语句,RET,过程名,ENDP,2025/5/19 周一,25,过程定义伪指令(,2,),所谓过程就是一般汇编语言子程序。设置过程的目的是为了简化程序的设计,它是模块化程序设计的基础。过程只需定义一次,可在程序的不同地方多次调用,可减少由源程序产生的目标代码的长度。,8088,汇编用,CALL,指令启动过程,用,RET,指令结束过程调用。过程的调用和返回通过寄存器、堆栈或特定的内存单元完成主程序和程序之间的参数传递。,2025/5/19 周一,26,模块命名、程序开始和程序结束伪指令,模块结束伪指令,END,表示模块到此结束。,格式为:,END ,标号,其中标号指示汇编程序开始执行的起始地址。如果多个模块连接,则只有主模块(通常为第一个模块)需使用标号,其它子模块只需用,END,而不必加标号。,模块的一般形式为:,NAME ,模块名,所有的语句,END ,启动标号或过程,2025/5/19 周一,27,4.4,汇编语言程序格式,名字项,操作项,操作数项,注释项,格式:,名字项,操作项,操作数项,;,注释项,2025/5/19 周一,28,名字项,标号,变量,标号及变量的,3,种属性,段,偏移,类型,2025/5/19 周一,29,名字项,这是给指令或某个存储单元地址所起的名字,可用下列字符来表示名字:,字母,A Z,,,a z,数字,09,特殊字符,?,、,、,、,_,、,$,数字不能作名字项的第一个字符。而圆点仅能用作第一个字符,可以用很多字符来说明名字,但名字项最长为,31,个字符。,名字项可以是标号或变量。它们都用来表示本语句的符号地址,它是可有可无的,只有当需要用符号地址来访问该语句时它才需要出现。名字项分标号和变量两种情况,在程序中同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。,2025/5/19 周一,30,操作项,操作项:,可以是指令、伪指令或宏指令的助记符。,对于指令,汇编程序将其翻译为机器语言指令,对于伪指令,汇编程序将根据其所要求的功能进行处理,对于宏指令,汇编程序则根据定义将其展开,2025/5/19 周一,31,操作数项(,1,),算术运算符,+,、,-,、*、,/,和,MOD,逻辑运算符,AND,、,OR,、,XOR,、,NOT,关系运算符,EQ,、,NE,、,LT,、,GT,、,LE,、,GE,数值返回运算符,TYPE,、,LENGTH,、,SIZE,、,OFFSET,、,SET,属性运算符,PTR,、段操作符、,SHORT,、,THIS,、,HIGH,、,LOW,2025/5/19 周一,32,操作数项(,2,),操作符的优先级别,圆括号中的项,方括号中的项,结构变量,然后是,LENGTH,,,SIZE,和,WIDTH,名:,(段取代),PTR,,,OFFSET,,,SEG,,,TYPE,,,THIS,及段操作符,HIGH,和,LOW,乘法和除法:*,,/,,,MOD,,,SHL,,,SHR,加法和减法:,+,,,-,关系操作:,EQ,,,NE,,,LT,,,GT,,,LE,,,GE,逻辑运算:,NOT,逻辑运算:,AND,SHORT,2025/5/19 周一,33,注释项,汇编语句的注释部分不属于程序本身,即注释不会影响汇编产生的目标程序。,汇编过程中,汇编程序对注释不作任何加工,注释只是为阅读程序及编写文件方便,对语句和程序段的功能进行说明。,2025/5/19 周一,34,汇编语言源程序采用的是分段结构,即一个汇编语言源程序由若干段组成(一般由数据段和代码段组成),每一个段以,SEGMENT,语句开始,以,ENDS,语句结束,整个程序的结尾是,END,语句。,在代码段中下面的内容是不可缺少的:,(1),定义段(使用,SEGMENT/ENDS,语句定义),(2),约定段寄存器和段的关系(即物理段和逻辑段的关系,使用一个或多个,ASSUME,语句实现),(3),装填段寄存器(只装填数据型段寄存器),(4),设置返回,DOS,的方法,汇编语言源程序的结构,2025/5/19 周一,35,例如:,MYDARA SEGMENT,;,定义数据段起始语句,;,定义数据,MYDATA ENDS,;,定义数据段终止语句,MYCODE SEGMENT,;,定义代码段起始语句,ASSUME CS:MYCODE,DS:MYDATA,;,约定段寄存器和段的关系,START:,MOV AX,MYDATA,;,装填相应的段寄存器,MOV DS,AX,;,完成所需功能的程序段,MOV AH,4CH,;,设置返回,DOS,INT 21H,MYCODE ENDS,;,定义代码段终止语句,END START,;,程序结束,2025/5/19 周一,36,例:,编程实现多字节加法,如,S=3B74AC60F8H+20D59E36C1H,F8H,60H,ACH,74H,3BH,C1H,36H,9EH,D5H,20H,被加数、和,加数,DATA1,DATA2,2025/5/19 周一,37,CODE SEGMENT,ASSUME CS,:,CODE,,,DS,:,DATA,START,:,MOV AX,DATA,MOV DS,AX,MOV CX,5,MOV SI,0,CLC,LOOPER,:,MOV AL,DATA2SI,ADC DATA1SI,,,AL,INC SI,DEC CX,JNZ LOOPER,MOV AH,4CH,INT 21H,CODE ENDS,END START,DATA SEGMENT,DATA1 DB 0F8H,60H,0ACH,74H,3BH,DATA2 DB 0C1H,36H,9EH,0D5H,20H,DATA ENDS,2025/5/19 周一,38,例:,FIRST,字变量里存有,1234H,,,SECOND,字变量里存有,5678H,。将,FIRST,字变量和,SECOND,字变量相加,结果存至,THIRD,存储字中。,2025/5/19 周一,39,DATA SEGMENT,first dw 1234h,second dw 5678h,third dw?,data ends,code segment,assume cs:code,ds:data,start:mov ax,data,mov ds,ax,mov ax,first,add ax,second,mov third,ax,jmp$,code ends,end start,
展开阅读全文