您好,欢迎访问三七文档
第二节伪指令汇编语言程序中的语句可以由指令、伪指令和宏指令组成。上一章我们介绍了8086指令系统中的6类指令,每一条指令都对应一种CPU操作。伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令,甚至是已定义的宏指令。宏指令将在第七章中介绍。伪指令和指令的区别在于,每一条指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。和各种指令一样,伪指令也是程序设计不可缺少的工具。下面介绍一些常用的伪指令。4.2.1处理器选择伪操作.8086选择8086指令系统.286选择80286指令系统.286P选择保护模式下的80286指令系统.386选择80386指令系统.386P选择保护模式下的80386指令系统.486选择80486指令系统.486P选择保护模式下的80486指令系统.586选择Pentium指令系统.586P选择保护模式下的Pentium指令系统4.2.2段定义伪指令段定义伪指令是表示一个段开始和结束的命令,80x86有两种段定义的方式:完整段定义和简化段定义,分别使用不同的段定义伪指令来表示各种段。1.完整段定义伪指令的格式如下:由于ASSUME伪指令只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中:MOVAX,DATA_SEG1;数据段地址MOVDS,AX;存入DS寄存器MOVAX,DATA_SEG2;附加段地址MOVES,AX;存入ES寄存器如果程序中还定义了堆栈段STACK_SEG,也需要把段地址装入SS中:MOVAX,STACK_SEG;堆栈段地址MOVSS,AX;存入ES寄存器注意,在程序中不需要用指令装入代码段的段地址,因为在程序初始化时,装入程序已将代码段的段地址装入CS寄存器了。而DS和ES是指向一个称为“PSP”(程序段前缀)的一块区域的首地址。为了对段定义作进一步地控制,SEGMENT伪指令还可以增加类型及属性的说明,其格式如下:段名SEGMENT[定位类型][组合类型]['类别']…段名ENDS[]中的内容是可选的,一般情况下,这些说明可以不用。但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要提供类型和属性的说明。·定位类型:说明段的起始边界值(物理地址)。定位类型说明BYTE段可以从任何地址边界开始WORD段从字边界开始,即段的起始边界值为偶数DWORD段从双字的边界开始,即段的起始边界值为4的倍数PARA段从小段边界开始,即段的起始边界值为16(或10H)的倍数PAGE段从页边界开始,即段的起始边界值为256(或100H)的倍数注意:定位类型的缺省项是PARA,即在未指定定位类型的情况下,则连接程序默认为PARA。BYTE和WORD用于把其它段(通常是数据段)连入一个段时使用;DWORD一般用于运行在80386及后继机型上的程序。·组合类型:说明程序连接时的段组合方法。组合类型说明PRIVATE该段为私有段,连接时将不与其它模块中的同名段合并PUBLIC该段连接时将与其它同名段连接在一起,连接次序由连接命令指定COMMON该段在连接时与其它同名段有相同的起始地址,所以会产生覆盖AT表达式段地址=表达式的值,其值必为16位但AT不能用来指定代码段MEMORY与PUBLIC同义STACK将多个同名堆栈段连接在一起,SP设置在第一个堆栈段的开始注意:组合类型的缺省项是PRIVATE。例:在连接之前已定义两个目标模块如下:模块1SSEGSEGMENTPARASTACKDSEG1SEGMENTPARAPUBLIC'Data'DSEG2SEGMENTPARACSEGSEGMENTPARA'Code'模块2DSEG1SEGMENTPARAPUBLIC'Data'DSEG2SEGMENTPARACSEGSEGMENTPARA'Code'以上两个模块分别汇编后产生.OBJ文件,经连接程序连接后产生的.EXE模块如下:模块1CSEGSEGMENTPARA'Code'模块2CSEGSEGMENTPARA'Code'模块1+2DSEG1SEGMENTPARAPUBLIC'Data'模块1DSEG2SEGMENTPARA模块2DSEG2SEGMENTPARA模块1SSEGSEGMENTPARASTACK2存储模型与简化段定义伪指令较新版本的汇编程序(MASM5.0与MASM6.0)除支持完整段定义伪指令外,还提供了一种新的简单易用的存储模型和简化的段定义伪指令。⑴.存储模型伪指令存储模型的作用是什么呢?存储模型决定一个程序的规模,也确定进行子程序调用、指令转移和数据访问的缺省属性(NEAR或FAR)。当使用简化段定义的源程序格式时,在段定义语句之前必须有存储模型.MODEL语句,说明在存储器中应如何安放各个段。MODEL伪指令的常用格式如下:..MODEL存储模型表MASM5.0和MASM6.0支持的存储模型:存储模型功能适用操作系统Tiny(微型)所有数据和代码都放在一个段内,其访问都为NEAR型,整个程序≤64K,并会产生.COM文件。MS-DOSSmall(小型)所有代码在一个64KB的段内,所有数据在另一个64KB的段内(包括数据段,堆栈段和附加段)。MS-DOSWindowsMedium(中型)所有代码>64K时可放在多个代码段中,转移或调用可为FAR型。所有数据限在一个段内,DS可保持不变。MS-DOSWindowsCompact(紧凑型)所有代码限在一个段内,转移或调用可为NEAR型。数据>64K时,可放在多个段中。MS-DOSWindowsLarge(大型)允许代码段和数据段都可超过64K,被放置在有多个段内,所以数据和代码都是远访问。MS-DOSWindowsHuge(巨型)单个数据项可以超过64K,其它同Large模型MS-DOSWindows51汇编程序实例:举一例说明:流水灯加数码管LOOP:;标号CLRP2.6;选中p2.6数码管左边的8字使能SETBP2.7;p2.7不使能。右边的数码管消隐MOVP0,#28H;把28h送p0口;数码管显示0LCALLDELAY;延时MOVP0,#0FFH;0ffh送p0口,数码管清除CLRP1.0;点亮p1.0发光管MOVP0,#7EH;把7eh送p0口;数码管显示1LCALLDELAYMOVP0,#0FFHCLRP1.1;点亮p1.0发光管CLRP1.0;点亮p1.0发光管MOVP0,#0A2H;数码管显示2LCALLDELAYMOVP0,#0FFHCLRP1.2CLRP1.1CLRP1.0MOVP0,#62H;数码管显示3LCALLDELAYMOVP0,#0FFHCLRP1.3CLRP1.2CLRP1.1CLRP1.0MOVP0,#74H;数码管显示4LCALLDELAYMOVP0,#0FFHCLRP1.4CLRP1.3CLRP1.2CLRP1.1CLRP1.0MOVP0,#61H;数码管显示5;LCALLDELAYMOVP0,#0FFHCLRP1.5CLRP1.4CLRP1.3CLRP1.2CLRP1.1CLRP1.0MOVP0,#21H;数码管显示6LCALLDELAYMOVP0,#0FFHCLRP1.6CLRP1.5CLRP1.4CLRP1.3CLRP1.2CLRP1.1CLRP1.0MOVP0,#7AH;数码管显示7LCALLDELAYMOVP0,#0FFHCLRP1.7CLRP1.6CLRP1.5CLRP1.4CLRP1.3CLRP1.2CLRP1.1CLRP1.0MOVP0,#20H;数码管显示8LCALLDELAYMOVP0,#0FFHLCALLDELAYMOVP0,#0FFHMOVP1,#0FFH;程序到此结果为左边的数码管显示0,1,2,3,4,5,6,7,8;p1.0------------p1.7指示灯依次点亮SETBP2.6;左边的8消隐CLRP2.7;选中p2.7数码管右边的8字使能,;MOVP0,#28HLCALLDELAYMOVP0,#0FFHMOVP1,#0FFHCLRP1.0MOVP0,#7EHLCALLDELAYMOVP0,#0FFHMOVP1,#0FFHCLRP1.1MOVP0,#0A2HLCALLDELAYMOVP0,#0FFHMOVP1,#0FFHCLRP1.2MOVP0,#62HLCALLDELAYMOVP0,#0FFHMOVP1,#0FFHCLRP1.3MOVP0,#74HLCALLDELAYMOVP0,#0FFHMOVP1,#0FFHCLRP1.4MOVP0,#61HLCALLDELAYMOVP0,#0FFHMOVP1,#0FFHCLRP1.5MOVP0,#21HLCALLDELAYMOVP0,#0FFHMOVP1,#0FFHCLRP1.6MOVP0,#7AHLCALLDELAYMOVP0,#0FFHMOVP1,#0FFHCLRP1.7MOVP0,#20HLCALLDELAYMOVP0,#0FFHMOVP1,#0FFHMOVP0,#0FFHMOVP1,#0FFH;这一段和上一段基本相同,不同的是右边的数码管依次显示012345678,左边的不亮;;同时p1口的灯流动显示:AJMPLOOP;注意:程序运行到此跳转到开始标号,重复执行:DELAY:;延时子程序;参考前面的教程:CLRP3.3;注意小喇叭在3.3口,这里可以使小喇叭发出嗒,嗒声MOVR7,#255NOPNOPD1:MOVR6,#255setbp3.3D2:DJNZR6,D2clrp3.3DJNZR7,D1SETBP3.3RETENDLOOP:;标号CLRP2.6;选中p2.6数码管左边的8字使能SETBP2.7;p2.7不使能。右边的数码管消隐MOVP0,#28H;把28h送p0口;数码管显示0;28为1010000LCALLDELAY;延时程序MOVP0,#0FFH;0ffh送p0口,数码管清除;P0口为11111111CLRP1.0;点亮p1.0发光管;P1。0为电平,P0口为11111110MOVP0,#7EH;把7eh送p0口;数码管显示1;P1。0为低电平,P0口为11111110LCALLDELAY;延时程序MOVP0,#0FFHMOVP0,#0FFH;0ffh送目录目录................................................................................................................................8************************************************************函数的使用和熟悉***************************************************************/....................................11实例3:用单片机控制第一个灯亮..........................................................................11实例4:用单片机控制一个灯闪烁:认识单片机的工作频率..............................11实例5:将P1口状态分别送入P0、P2、P3口:认识I/O口的引脚功能..........12实例6:使用P3口流水点亮8位LED.....................................................................13实例7:通过对P3口地址的操作流
本文标题:第二节伪指令
链接地址:https://www.777doc.com/doc-2187720 .html