8汇编语言的程序结构与语句格式

上传人:dja****22 文档编号:243021078 上传时间:2024-09-14 格式:PPT 页数:37 大小:67KB
返回 下载 相关 举报
8汇编语言的程序结构与语句格式_第1页
第1页 / 共37页
8汇编语言的程序结构与语句格式_第2页
第2页 / 共37页
8汇编语言的程序结构与语句格式_第3页
第3页 / 共37页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,(一)汇编语言源程序的框架结构,一、汇编语言源程序的结构特点,80X86/Pentium汇编语言源程序具有如下结构特点。,(1) 80X86/Pentium汇编语言源程序是由,若干个逻辑段,所组成的,,各个逻辑段的段名和其他属性,由,段定义语句,来定义和说明。,所谓逻辑段是指,程序员使用段定义语句定义的段区,。逻辑段与,内存中的实际物理段区,并不是一一对应的,一个物理段可能是由一个逻辑段所构成的,也可能是由几个逻辑段组合而成的。,80X86/Pentium系列微处理器都采用,存储器分段管理模式,,因此,其汇编语言源程序逻辑段代码,和,数据,的。,1,(2)汇编语言源程序中的逻辑段分为,代码逻辑段,、,数据逻辑段,和,堆栈逻辑段,三种类型。, 代码逻辑段,指示汇编程序在内存中开辟一个段区,用以存放,该逻辑段内所有汇编指令的机器代码,。,数据逻辑段,指示汇编程序在内存中开辟一个段区,用以存放,该逻辑段所定义的所有变量,以及,工作缓冲区,。,堆栈逻辑段,指示汇编程序在内存中开辟一个段区,用以存放,堆栈,,以支持系统进行,堆栈操作,(PUSH/POP操作)、,过程调用,、,中断处理,以及,在各模块之间传递参数,等等。,2,(3)对于,8086/8088,和,工作在实地址模式下的80X86/Pentium系列微处理器,,每个物理段的最大长度均为64KB,段内偏移地址的地址范围为:0000H, FFFFH,。,当工作在,保护模式,时,80286允许每个物理段的最大长度为16MB;80386、80486和Pentium系列微处理器允许每个物理段的最大长度为4GB。,(4)在代码逻辑段的开始处,必须使用,ASSUME伪指令,来说明,各个逻辑段与各个段寄存器之间的对应关系,。但是,段寄存器与逻辑段之间的真正联系,还必须要求程序员通过,设置各个段寄存器(CS除外)的初值,来建立,只有这样才能真正建立,起这些逻辑段的可寻址性。,3,(5)8086/8088/80286只有4个段寄存器:CS、DS、ES和SS,在任意时刻,CPU只能通过这4个段寄存器来访问它们所指向的4个物理段。,然而汇编语言源程序可能包含的逻辑段未必只有4个,在链接组合后,这些逻辑段所构成的物理段也可能多于4个,因此用户程序只能在不同时刻,将段寄存器设置为不同的初值,使之在不同时刻分别指向不同的物理段。,当用户程序运行起来后,一个段寄存器可以在不同时刻分别指向内存中的几个物理段,因此一个段寄存器可以对应于源程序中的几个逻辑段。,80X86/Pentium系列微处理器有6个段寄存器,分别为:代码段CS、堆栈段SS、数据段DS、附加数据段ES、FS和GS。,4,(6)每个,逻辑段,由若干行,汇编语句,组成,每行只能有一条汇编语句。,(7)整个汇编语言源程序必须以,END语句,来结束。,该语句通知,汇编程序,停止汇编。END后面的标号START通知汇编程序,将用户程序设置为从标号START处开始执行,即指定,操作系统的入口点,。,(8)当用户程序执行完毕后,为保证系统流程能自动返回到DOS操作系统,每个汇编语言源程序都必须在代码段中包含,返回到DOS操作系统的指令序列,。,5,;打印输出字符串“THIS IS A SAMPLE PROGRAM”,STACKSEGMENT PARA STACK STACK,DB 1024 DUP(0),STACKENDS,DATASEGMENT,MESSAGEDB THIS IS A SAMPLE PROGRAM,DB 0DH,0AH,$,DATAENDS,6,CODESEGMENT,ASSUME CS:CODE, DS:DATA, SS:STACK,START:,MOVAX, DATA ;建立DATA数据段的可寻址性,MOVDS, AX,LEABX, MESSAGE,LOOP1:CMPBYTE PTR BX, $,JELOOP2,MOVAH, 5 ;功能号为05H的DOS系统功能调用,,MOVDL, BX ;其作用是在显示器上输出字符(DL),INT21H,INCBX,JMPLOOP1,LOOP2:MOVAH, 4CH ;功能号为4cH的DOS系统功能调用,,INT21H ;其作用是返回DOS,CODEENDS,END START,7,二、源程序与PC DOS的接口,任何程序都是在操作系统的环境下运行的,用户程序启动后,CPU的执行流程,即CPU控制,将从操作系统转移到用户程序。因此在编写用户程序时,程序员必须了解,用户程序与操作系统的接口,。,本课程讲解的汇编语言源程序将在PC DOS环境下运行,因此必须了解汇编语言与PC DOS系统的接口。,8,在,DOS,状态下,当执行一,条,外部命令,或执行一个,用户程序,时,,DOS系统,将依次完成以下工作。,(1)建立并填充程序段前缀区,PSP,首先,,在,可用内存最低地址区的小段边界,上,为用户程序建立一张表,称为,程序段前缀区,PSP,,其长度为256个字节。,其次,将,有关用户程序的相关信息,填充到程序段前缀区PSP中。其中,,在,PSP的第一个字节,处(偏移地址0000H)存放一条,INT 20H软中断指令,。,INT 20H的中断服务程序,由PC DOS提供,其功能是,使系统返回到DOS管理状态,。因此程序员可以这样来组织用户程序:当CPU执行完用户程序后,能够跳转到PSP开始处,去执行INT 20H指令。,9,(2)定位用户程序并初始化各寄存器,首先,,将整个用户程序定位于PSP正下方,紧跟在PSP后面,。,其次,设置各寄存器的初值如下,。, DS和ES,:指向,PSP的第一个字节,,即PSP段区的段地址。, SS和SP,:SS被设置为,堆栈段的段基址,,SP指向,堆栈的栈底,(取决于堆栈的长度)。, CS 和IP,:CS被设置为,用户程序代码段的段基址,,IP被设置为,代码段中第一条被执行指令的段内偏移地址,。,10,(3)执行用户程序,从(CS):(IP)位置开始,执行用户程序。,DOS系统加载,用户程序文件.exe,之后,在执行该程序之前,各个寄存器和内存的状态如下图所示。,11,SS,00FFH,0000H,程序段前缀区PSP,INT 20H 指令低字节,INT 20H 指令高字节,PSP最后一个字节,堆栈区第一个字节,(用户程序第一个字节),堆栈区最后一个字节,数据段区第一个字节,数据段区最后一个字节,SP,栈底,用户程序第一条指令,用户程序,第一条被执行的指令,用户程序最后一条指令,IP,CS,用户堆栈段区,用户数据段区,用户代码段区,用户程序区,DS、ES,可用内存最低地址区的小段边界,12,通过以上讨论可知,为保证CPU在执行完用户程序后能自动返回到DOS,在用户程序中,程序员可以采取以下两项措施。,(1)将,用户程序的主程序,定义为,FAR过程,,该过程就是用户程序的入口点,其最后一条指令为,RET,。,(2)在,主程序的开始处,,将,PSP段区的段基址DS/ES,和,数值0000H,,即INT 20H指令的全地址,分别压入堆栈保存,见以下三条指令。,PUSHDS;保护PSP段基址,MOVAX,0,PUSHAX;保护INT 20H指令的段内偏移地址,执行这三条指令后,堆栈中就保存了,程序段前缀区中的INT 20H指令的全地址,。,当CPU执行到主程序的最后一条指令RET时,由于该过程被定义为FAR,RET指令将从堆栈中分别弹出,偏移量0,和,PSP段基址,给IP和CS,于是CPU随后将要执行的下一条指令就是INT 20H。执行这条指令后,程序控制就返回到DOS。,以上这三条指令保证了程序控制能正确返回DOS,常称为,标准序,。,13,采取以上两项措施后,汇编语言源程序的基本结构如下例所示。,;打印输出字符串“THIS IS A SAMPLE PROGRAM”,STACKSEGMENT PARA STACK STACK,DB 1024 DUP(0),STACKENDS,DATASEGMENT,MESSAGEDB THIS IS A SAMPLE PROGRAM.,DB 0DH,0AH,$,DATAENDS,14,CODESEGMENT,ASSUME CS:CODE, DS:DATA, SS:STACK,STARTPROCFAR,PUSHDS ;返回DOS操作系统的标准序,MOVAX, 0,PUSHAX,MOVAX, DATA ;建立DATA数据段的可寻址性,MOVDS, AX,LEABX, MESSAGE,LOOP1:CMPBYTE PTR BX, $,JELOOP2,MOVAH, 5 ;功能号为05H的DOS系统功能调用,,MOVDL, BX ;其作用是在显示器上输出字符(DL),INT21H,INCBX,JMPLOOP1,LOOP2:RET,STARTENDP,CODEENDS,END START,15,说明:,(1)CPU开始执行用户程序时,DS和ES所指向的是PSP段,没有指向用户程序的数据段。因此在标准序后,应该重新设置DS或ES,使它们指向,用户程序的数据段,。,MOV AX, DATA ;建立DATA数据段的可寻址性,MOV DS, AX,(2),返回DOS的非标准方法,不用定义主程序为FAR过程,去掉标准序部分,只需要在代码段结束之前增加以下两句。,MOV AH,4CH,INT 21H,程序执行完毕后,系统同样可以正常返回到DOS状态,如下例所示。,16,;打印输出字符串“THIS IS A SAMPLE PROGRAM”,STACKSEGMENT PARA STACK STACK,DB 1024 DUP(0),STACKENDS,DATASEGMENT,MESSAGEDB THIS IS A SAMPLE PROGRAM.,DB 0DH,0AH,$,DATAENDS,CODESEGMENT,ASSUME CS:CODE, DS:DATA, SS:STACK,START:,MOVAX, DATA;建立DATA数据段的可寻址性,MOVDS, AX,LEABX, MESSAGE,LOOP1:CMPBYTE PTR BX, $,JELOOP2,MOVAH, 5;功能号为05H的DOS系统功能调用,其作用是在显示器,MOVDL, BX;上输出字符(DL),INT21H,INCBX,JMPLOOP1,LOOP2:MOVAH, 4CH,;功能号为4cH的DOS系统功能调用,其作用是返回DOS,INT21H,CODEENDS,END START,17,(二)汇编语言的语句,语句,是汇编语言源程序的,基本组成单位,,汇编语言源程序本身就是一个,语句序列,。一条语句规定了一个,基本操作要求,,而一个语句序列则完成一个特定的任务。,一、语句的种类,80X86/Pentium汇编语言拥有以下三种类型的语句。, 指令性语句,由,一条CPU指令,所构成的,语句,指,示,汇编程序,把该,语句翻译成对应的,机器目标代码,。,指令性语句所指定的操作是由CPU在执行程序时来完成的。,例:,MOV DS,AX;机器目标代码为:8EH D8H,18, 伪指令语句,为,汇编程序,提供汇编信息,并指示,汇编程序,执行有关操作的语句。,在汇编过程中,,汇编程序,将根据,伪指令语句所指示的操作和提供的汇编信息,,执行相应的操作,例如定义符号、分配存储单元、程序分段等等。 因此伪指令语句所指定的操作是在汇编过程中,由汇编程序来完成的,伪指令语句并不产生机器目标代码。,例1:,SEGMENT/ENDS,该语句将,源程序的分段信息,(段名、段属性等),提供给汇编程序,并指示汇编程序进行有关,分段操作,。,19,例2:,MESSAGE DB THIS IS A SAMPLE PROGRAM,该语句定义了一个,字节类型数组变量MESSAGE,及其初始值。,汇编时,汇编程序首先定义一个,名为MESSAGE的字节类型数组变量,,并为其分配一个数据块,然后把字符串常量THIS IS A SAMPLE PROGRAM存放到该数据块中。, 宏指令语句,由,宏指令,组成的语句。,20,二、语句的格式,指令性语句和伪指令语句的格式是类似的,均由4个字段组成。,指令性语句,:,标号: 前缀 指令助记符 操作数,操作数, ;注释 ,伪指令语句:, 名字 伪指令定义符 操作数,操作数, ;注释 ,标号,表示,CPU指令所在存储单元的地址,,它是一种,符号地址,。在程序中,标号常常作为,控制转移类指令的转移目标地址,。,名字,伪指令语句所定义的,常量名,、,变量名,、,过程名,、,段名,和,宏指令名,等。,21,标号和名字的命名方法,必须符合,汇编语言标识符,的定义规则如下。, 以,字母,开头,由,字母,(az或AZ,不区分大小写)、,数字,(09)和,部分字符,(?、$ 和 下划线_)组成,字符串长度不超过31个。, 不能是,汇编语言的保留字,,例如:AX,AH,AL等。,指令助记符和伪指令定义符,指令助记符,表示,指令性语句的操作性质,;,伪指令定义符,表示,伪指令语句的伪操作功能,,该字段是语句中唯一不可缺省的。,指令助记符前面可以根据需要加,前缀,。在80X86/Pentium指令系统中,允许与指令助记符一起出现的前缀有重复前缀REP、REPE、REPNE等等。,操作数,指令性语句的操作数部分,提供,该指令的操作对象,。该部分说明要处理的数据存放在什么位置以及如何访问它。,伪指令语句操作数部分,的格式和含义,随伪操作命令的不同而不同。,注释,注释由分号“;”开始,用来对一条语句或一段程序进行说明。汇编程序并不处理该部分。,22,三、语句中的操作数,操作数分为以下4类。,1)常量操作数,在,汇编时,其值已经确定,且在,整个程序运行期间,不变化的量称为,常量,。常见的常量形式有以下几种。, 整型数值常量,整型数值常量就是一个,整型数值,,我们可以使用,各种进位计数制形式,来表示它。,在一个整型数值的后面分别加上字母B、D、Q和H,就表示该数分别为二进制、十进制、八进制和十六进制整型数值常量。,十进制数后面的D可以省略,十六进制数的第一个数字必须是09。,例如:,十进制数9可分别表示为以下五种形式:,1001B、9D、9、11Q、09H,十六进制数ABH也可表示为以下五种形式:,10101011B、171D、171、253Q、0ABH,23, 字符串常量,就是用,单引号,括起来的一个或多个字符。,字符串常量的数值,就是,相应字符的ASCII码序列,。,例如:,ABCDE = 41H 42H 43H 44H 45H,12345 = 31H 32H 33H 34H 35H,5= 35H,因此,,字符串常量,与,整型数值常量,之间可以交替使用。, 符号常量,符号常量是指,使用伪指令EQU或 = 定义的常量标识符,。,例如:,PORTEQU80H,TEMP =0,24,2)寄存器操作数,程序可见的寄存器名,例如 AX,BX,CX,DX 等等,3)标号、过程名和变量, 标号,存放,CPU指令,的内存存储区的首字节单元的,符号地址,。, 过程名,存放,过程代码,的内存存储区的首字节单元的,符号地址,。,在汇编语言程序中,标号和过程名都是,代码段内的符号地址,。,25,DATA1,2000H, 变量,在,汇编时,其值不确定,在程序运行期间其值不断变化的量称为,变量,。,在汇编语言中,每一个变量都被分配一个存储单元,,变量的值,被存放在该存储单元中;,变量的地址,就是该存储单元的地址。,为便于在程序中访问一个变量,我们常常为该变量起一个名字,称为,变量名,,在汇编程序中,变量常常以,变量名,的形式出现。,我们知道,CPU只能通过,存储单元的地址,来访问,存储单元的内容,,因此CPU也只能通过,变量的地址,来访问,变量的内容,。,因此,变量名,本质上就是,分配给该变量的存储单元的符号地址,,该地址可以在数据段、堆栈段或者代码段中。,78H,56H,变量名:,DATA1,变量DATA1的值 :12345678H,变量DATA1的地址:(DS:2000H),MOV AX,DATA1;(AX)=5678H,26, 标号、过程名和变量的属性,标号是存放CPU指令的存储单元的符号地址,过程名是存放过程代码的存储区首字节单元的符号地址,变量名则是存放变量内容的存储单元的符号地址。可见,标号、过程名和变量名都与,存储器地址,相关联,因此它们都具有以下三种属性。,段属性,标号、过程名和变量名所标识的存储单元的,段基址,。,偏移量属性,标号、过程名和变量名所标识的存储单元的,段内偏移地址,。,27,类型属性,变量的类型,是指,存放变量内容的存储单元的字节大小,,共有以下六种。,BYTE:字节WORD:字,DWORD:双字QWORD:四字,FWORD:六字节TWORD:十字节,标号和过程名的类型,是指,标号和过程名被引用的方式,,共有以下两种。,NEAR类型,:标号或过程名,在本段内被引用,。,FAR类型,:标号或过程名,被其他段所引用,。,28,4)表达式操作数,所谓表达式是指由,常量、寄存器名、标号或变量名,与,运算符,相组合的序列。,在汇编期间,,汇编程序,将按照一定的优先规则对表达式进行处理,最后将得到一个,数值,、一个,地址值,、或相应寻址方式的,机器代码,。,根据最后处理结果的类型,表达式分为两种类型:,数值表达式,和,地址表达式,。,29,数值表达式,最后处理结果为数值的表达式。,数值表达式通常是由,常量操作数,与,算术运算符、逻辑运算符或关系运算符,连接而成。,例如:,MOV AX,,10 * 20,STRINGDB,A+ 20H,汇编时,汇编程序将对数值表达式进行处理,最后得到一个数值,该数值可作为,指令中的立即操作数,或,某存储单元的初值,。,30,地址表达式,最后处理结果为地址值或相应寻址方式的机器代码的表达式,通常由,常量、变量名、标号或寄存器名,与,运算符,连接而成。,地址表达式主要用来表示,指令性语句中的操作数地址,或,转移目标地址,。,例如:,JMP,2000H:0100H,MOVAX,,STRING + 1,JMP,NEXT,MOVAX,,BX,MOVAX,,ES: SI + 4 ,当地址表达式的值表示,存储器地址,时,该表达式也具有,段属性,、,偏移量属性,和,类型属性,。,31,运算符,MASM宏汇编有六种运算符:算术运算符、逻辑运算符、移位运算符、关系运算符、分析运算符和合成运算符。, 算术运算符,加 +、减 -、乘 *、除 /、求余MOD。,算术运算符可用于,数值表达式,中,运算结果是一个,数值,,例如:,xdb,(19+(20-10*2)/(2*3+1),ydb,(19+(20-10*2)mod(2*3+1),算术运算符也可用于,地址表达式,中,但表达式的运算结果必须要有,明确的物理意义,才有效。例如:两个地址的相加、相乘和相除都是无意义的。,32,算术运算符应用于地址表达式的常见形式如下:,标号或变量 数值表达式,这个地址表达式的运算结果仍然为一个,标号,或,变量,,其类型属性和段基址属性都不变,但其偏移量产生一个位移。,例如:,设有数组ARRAY定义如下。,ARRAR DW 1,2,3,4,5,6,7,则地址表达式(ARRAR + 5*2)表示,下标为5的数组元素的地址,。,33,同一段内的两个变量或标号相减的运算结果,不是地址值而是一个,数值,,表示,两个变量或两个标号之间相距的字节数,。,例如:,设有数组ARRAY定义如下:,ARRAR DW 1,2,3,4,5,6,7,X DW10,则,表达式(X - ARRAR)/ 2,表示,数组ARRAY的元素个数,。,在汇编期间,当汇编程序处理以下指令时,MOV CX,(X - ARRAR)/ 2,汇编程序将计算出这个表达式的值为7,将上述指令处理成,MOV CX,7,34, 逻辑运算符,AND(与)、OR(或)、XOR(异或)、NOT(非)共四种逻辑运算符。,逻辑运算都是,按位操作,的,并且只能应用于,数值表达式,中,其操作对象只能是,常量操作数,。,例如:,MOV AX,0FE AND 81H,逻辑运算符,与,逻辑运算指令助记符,在形式上是一样的,但是它们有本质上的不同。,逻辑运算符,是汇编程序在汇编过程中执行的运算处理。,逻辑运算指令助记符,是CPU在执行该指令时所进行的运算处理。在汇编期间,它被汇编程序翻译成机器代码。,例如:,AND Al,0FE AND 81H ;机器代码:24 80,35, 关系运算符,关系运算符共有以下六种。,EQ:相等NE:不等,LT:小于LE:小于等于,GT:大于GE:大于等于,关系运算符的两个操作数必须都是,数值,或是,同一段内的两个存储器地址,。,关系运算的结果是一个,逻辑值,,如果比较关系成立,则结果为“真”,表示为,全1,;如果比较关系不成立,则结果为“假”,表示为,全0,。,例如:,MOV AX,(PORT LT 5)AND 20)OR(PORT GE 5)AND 30),36, 分析运算符与合成运算符,分析运算符的运算对象是,标号、过程名或变量,。该运算符返回,标号、过程名或变量名的属性值,。,合成运算符用于修改,存储器操作数的属性,。,不同运算符具有不同的运算优先权,当它们同时出现于一个表达式中时,其运算次序是不同的。关于优先权等级规定见书中表。,37,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!