已阅读5页,还剩91页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,2020/5/11,第三章汇编语言程序设计,南京理工大学动力学院,2009年11月,2,2020/5/11,汇编语言:汇编语言是一种面向计算机的符号语言。用指令的助记符、符号地址、标号、伪指令等书写程序的语言。汇编语言源程序:用汇编语言书写的源程序。汇编:将汇编语言源程序翻译成机器语言程序的过程。汇编程序:完成汇编过程的系统程序。,3,2020/5/11,在8086/8088汇编语言中,有两类汇编语言指令。一类是指令性语句,称为真指令汇编程序汇编后可产生机器指令代码;另一类是指示性语句,称为伪指令其作用仅仅是告诉汇编程序对源程序中的执行性指令应该如何产生代码,或分配存储区。,3.1汇编语言的基本元素,4,2020/5/11,一、汇编语言的指令语句格式由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。每个语句由1-4个部分组成。其格式是:标识符指令助记符操作数;注释,其中,带方括号的项是任选项。,5,2020/5/11,1标号(标识符Identifiers),标识符是由程序员定义的具有特定意义的字符序列,是给指令或某一存储单元地址所起的名字。标识符可由下列字符组成:字母:A-z;数字:0-9;特殊字符:?、_、$。,6,2020/5/11,标识符最多为31个字符。数字不能作标识符的第一个字符。当标识符后跟冒号时,表示是标号。它代表该行指令的起始地址。当标识符后不带冒号时,表示变量。伪指令前的标识符不加冒号。,标识符指令助记符操作数;注释,7,2020/5/11,2指令助记符(保留字Reservedwords)是一类特殊的标识符,可以是8086/8088的指令助记符,也可以是伪指令。如果指令带有前缀(如LOCK、REP、REPEREPZ、REPNEREPNZ),则指令前缀和指令助记符要用空格分开。标识符指令助记符操作数;注释,8,2020/5/11,3操作数指令执行的对象例如:RET;无操作数INCBX;一个操作数MOVCX,DI;两个操作数如果是伪指令,则可能有多个操作数,例如:COSTDB3,4,5,6,7;5个操作数当操作数超过1个时,操作数之间应用逗号分开。操作数可以是常数、寄存器名、标号、变量,也可以是表达式,例如:MOVAX,BP+4;标号指令助记符操作数;注释,9,2020/5/11,4注释该项是为源程序所加的注解,用于提高程序的可读性。在注释前面要加分号“;”,它位于操作数之后。汇编时,对注解不作处理,仅在列源程序清单时列出,供编程人员阅读。例如:INAL,PORTB;读B口到AL中标号指令助记符操作数;注释,10,2020/5/11,注释,语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性必要时,一个语句行也可以由分号开始作为阶段性注释汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理,11,2020/5/11,二、汇编语言的运算符汇编语言运算符所指定的操作由汇编程序在汇编过程中完成,结果作为指令的目标代码被保存,与程序执行时CPU完成的可执行指令是两回事,故汇编语言运算符也称为伪操作符。汇编语言的运算符有:算术运算符:+、MOD;逻辑运算符:AND、OR、NOT、XOR;关系运算符:EQ、NE、LT、GT、LE、GE;取值运算符:SEGOFFSETTYPE属性运算符:PTR,12,2020/5/11,1算术运算符和逻辑运算符,(1)算术运算符:+、MOD算术运算符只能用于数字量操作数,结果也是数字量。用于存储器操作数时,只有、运算符有意义。MOD取模是求数字量除法所得的余数。,(2)逻辑运算符:AND、OR、NOT、XOR逻辑运算符的操作只能是数字的,且结果也是数字的。注:1.存储器操作数不能进行逻辑运算。2.逻辑运算作为运算符时,是在程序汇编时计算作为指令助记符时,则是在程序执行时计算。,13,2020/5/11,2关系运算符,关系运算符:EQ、NE、LT、GT、LE、GE;相等EQ(Equal)、不等NE(NotEqual)、小于LT(LessThan)、大于GT(GreaterThan)、小于等于LE(LessThanorEqual)、大于等于GE(GreaterThanorEqual)关系运算符连接的两个操作数,必须都是数字的或是在同一段内的存储器的地址。若关系为假(关系不成立),则结果为0;若关系为真(关系成立),则结果为全1。,14,2020/5/11,MOVBX,(PORTLT5)AND20)OR(PORTGE5)AND30)当PORT的值小于5时,上述指令汇编为:MOVBX,20否则上述指令汇编为:MOVBX,30,例如:,关系为假,结果为0,关系为真,结果为全1,15,2020/5/11,3取值运算符(分析运算符)把存储器地址操作数分解成它的组成部分。取值运算符有:SEG、OFFSET、TYPE、SIZE和LENGTHSEG给出一个变量或标号的段地址;OFFSET给出一个变量或标号的16位偏移量;TYPE返回表示存储器操作数内存变量和标号类型的数值。,16,2020/5/11,格式:SEG符号名OFFSET符号名TYPE符号名例如:MOVAX,SEGSLOT;将SLOT的段地址送入AX寄存器MOVAX,OFFSETSLOT;将SLOT的偏移地址送入AX寄存器,17,2020/5/11,SIZE取得并返回由DUP定义的内存变量的字节数。LENGTH取得并返回由DUP定义的内存变量基本单元的个数。关系:SIZE=LENGTHTYPE,例如:若MULT-WORDDW50DUP(0)则LENGTHMULT-WORD=50TYPEMULT-WORD=2SIZEMULT-WORD=100,18,2020/5/11,定义的变量名具有五种属性:,5)规模属性表示格式:SIZE变量名表示变量所在数组的字节总数。即:SIZE=LENGTHTYPE,4)长度属性表示格式:LENGTH变量名表示变量所在数组的数据元素个数。只当数据用DUP定义时,LENGTH才等于数组的元素个数,否则LENGTH=1。,3)类型属性表示格式:TYPE变量名表示变量所在内存数据的类型;DB(TYPE=1)DW(TYPE=2)DQ(8),2)偏移地址属性表示格式:OFFSET变量名表示变量在所在段中的偏移地址,1)段属性表示格式:SEG变量名表示变量所在段的段基值。,19,2020/5/11,定义的标号具有三种属性:,1)段属性表示格式:SEG标号表示标号所在段的段基值。,2)偏移地址属性表示格式:OFFSET标号表示标号所在段的偏移地址,3)类型属性表示格式:TYPE标号表示标号的转移类型;对近和远转移标号TYPE依次返回FFFFH、FFFEH,取值运算符返回的是一个字操作数!,20,2020/5/11,$运算符$:当前地址偏移量的值,BLOCKDBHELLO!NUMEQU$-BLOCK,;NUM为6,21,2020/5/11,4属性运算符(合成运算符)属性运算符用来给指令中的操作数指定一个临时属性,而暂时忽略当前的属性。(1)合成运算符PTR忽略当前操作数的类型(字节或字)及(NEAR或FAR),而给出一个临时的类型。一般格式如下:类型PTR操作数表达式PTR运算符建立一个存储器地址操作数,它与PTR右边的存储器地址操作数有相同的段地址与偏移量,而其类型由左边给出的类型重新确定。,22,2020/5/11,例如:SLOTDW25MOVAL,BYTEPTRSLOTSLOT已定义成字单元。若想取出它的第一个字节内容,则可用PTR使它暂时改变为字节单元。MOVBX,5;汇编程序不知道是字节还是字传送MOVBYTEPTRBX,5;若是字节传送MOVWORDPTRBX,5;若是字传送标号也可以改变类型属性JMPFARPTRSTEP即使标号STEP原先是NEAR型的,使用FARPTR后,这个转移就变成段间转移了。,23,2020/5/11,(2)合成运算符THIS象PTR一样可用来建立一个特殊类型的存储器地址操作数,新的存储器地址操作数的段和偏移量部分就是下一个能分配的存储单元的段和偏移量,即汇编程序进行汇编遇到THIS时的当前值。其类型在THIS运算符后面指定。例如:MY_BYTEEQUTHISBYTEMY_WORDDW?将建立MY_BYTE具有字节类型,且与MY_WORD具有相同的段和偏移地址属性。,24,2020/5/11,(3)符用于在一条指令中以新的段属性取代旧的段属性。有两种格式:段寄存器:地址表达式例如:ADDAX,ES:ALT段名:地址表达式所用的段名事前必须通过ASSUME伪指令与一个段寄存器建立联系。例如:ASSUMEES:EXTRA_DATAADDAX,EXTRA_DATA:ALT,25,2020/5/11,三、表达式,表达式是由运算符和操作数组成的序列。在汇编时,它产生一个确定的值。仅表示一个常量,相应的表达式称为常量表达式;也可以表示一个存储单元的偏移地址,相应的表达式称为地址表达式。,26,2020/5/11,二进制数二进制数字后跟字母B。如01000001B。八进制数八进制数字后跟字母Q或O。如202Q或202O。十进制数十进制数字后跟D或不跟字母。如85D或85。十六进制数十六进制数字后跟H。如56H,0FFH。注意:当数字的第一个字符是A-F时,在字符前应添加一个数字0,以示和变量的区别。,1常数,27,2020/5/11,十进制浮点数浮点十进制数。如25E-2十六进制实数十六进制实数后跟R。数字的位数必须是8,16或20。在第一位是0的情况下,数字的位数可以是9,17或21。如0FFFFFFFFR。注意:、两种数字格式只允许在MASM中使用。字符和字符串字符和字符串要求用单引号括起来,如BD。,28,2020/5/11,2常量操作数常量操作数是一个数值操作数,一般是常量或者是表示常量的标识符。例如常量操作数有100,PORT,VAL等。数字常量操作数可采用二、八、十或十六进制等形式。操作数值的允许范围为2n-2n-1。字符串常量操作数值为相应字符的ASCII码。常量操作数是出现在程序中的确定值,它在程序的运行期间不会发生变化。,29,2020/5/11,存储器操作数是一个地址操作数,代表一个存储单元的地址。可以分为变量及标号两者类型:变量是存放该变量的存储单元的符号地址存储器操作数所代表的是某个数据在数据段、附加段或堆栈段中的地址,称变量。变量所对应的存储单元内容在程序的运行过程中是可以改变的。标号则是指令代码的符号地址存储器操作数所代表的是某条指令代码在代码段中的地址,在程序运行过程中不能改变,标号通常作为转移指令或调用指令的目标操作数。,3存储器操作数,30,2020/5/11,存储器操作数具有有三个属性:(1)段地址:存储单元所在段的段地址;(2)偏移地址:存储单元在所在段内的偏移地址;(3)类型:变量的类型是存储单元所存放数据项的字节数;标号的类型作为转移或调用指令的目标操作数的寻址方式,即NEAR和FAR。标号的默认类型属性为NEAR。,31,2020/5/11,4常量表达式常量表达式通常由常量操作数及运算符构成,在汇编时,产生一个常量。例如:PORT_VAL十1PORT_VALAND20H分析运算符作用于存储器操作数所形成的表达式也是常量表达式。例如:OFFSETSUMSEGSUMTYPECYCLE,32,2020/5/11,5地址表达式地址表达式通常由存储器操作数与运算符构成。地址操作数构成地址表达式时,必须有明确的物理意义。所以对存储器操作数的运算可以是加或减一个常量。例:SUM2、CYCLE5表达式SUM2、CYCLE5的值仍然是一个存储器操作数,其段地址与类型分别与存储器操作数SUM及CYCLE相同,但偏移地址分别比SUM大2及CYCLE小5。表达式是在汇编时计算的,而变量单元的内容在程序的运行过程中可以改变。,33,2020/5/11,四、汇编语言程序汇编步骤,编辑程序,源程序,连接程序,汇编程序,目标程序,执行程序,.ASM,.OBJ,.EXE,汇编,连接,34,2020/5/11,宏汇编程序:MASM.EXE,连接程序:LINK.EXE,步骤:1)编写源程序;2)汇编;3)连接;4)调试。,35,2020/5/11,1.编写源程序用文本编辑程序EDIT.EXE或EDLIN编写汇编语言源程序,产生扩展名为.ASM的源文件。2.汇编用汇编语言编写的源程序经过汇编程序MASM.EXE自动翻译成目标程序,产生扩展名为.OBJ的目标文件;对源程序中使用了非法指令,标号重复,相对转移超出转移范围等非逻辑性错误给出提示。8086的汇编程序为ASM-86,扩展后的宏汇编程序为MASM-86,增加了宏处理功能、条件汇编及某些伪指令,且可支持8087协处理器的操作。,36,2020/5/11,3.链接用链接程序LINK.EXE将一个或多个.OBJ目标程序进行链接,生成扩展名为.EXE的可执行程序。4.调试经过上述步骤所获得的.EXE可执行文件,在运行过程中可能出现逻辑错误,需对可执行文件.EXE进行调试。调试汇编程序最常用的工具是动态调试程序DEBUG。其中从某地址运行程序、设置断点、单步跟踪等功能,可以支持对程序的调试。,37,2020/5/11,伪指令语句也称为指示性语句,是用来对程序的汇编过程进行控制,所以,伪指令不是CPU运行的指令,而是程序员给汇编程序下达的命令。是在汇编源程序期间由汇编程序执行的命令。,3.2伪指令,伪指令用来对汇编程序进行控制,对程序中的数据进行存储空间分配、实现条件汇编、列表等处理,其格式和汇编指令一样,但不产生目标代码,即不直接命令CPU去执行什么操作。,38,2020/5/11,3.2.1定义数据伪指令,该类伪指令用来定义存储空间及其所存数据长度。DB:定义字节,即每个数据是1个字节;DW:定义字,即每个数据占1个字(2个字节);DD:定义双字,即每个数据占2个字。低字部分在低地址,高字部分在高地址;DQ:定义4字长,即每个数据占4个字;DT:定义10个字节长,用于压缩式十进制数。,39,2020/5/11,例:DATA1DB5,6,8,100,ABCD,表示从DATA1单元开始,连续存放5,6,8,100,共占4个字节地址。DATA2DW7,287表示从DATA2单元开始,连续存放7,287两个字,共占4个字节地址。TABLEDB?;定义一个存储区时,也可以不放数据,表示在TABLE单元中存放的内容是随机的。,40,2020/5/11,DATA1,DATA2,DATA1DB5,6,8,100,ABCDDATA2DW7,287,AB,CDDATA3DDAB,CD,DATA3,41,2020/5/11,当定义一个存储区内的每个单元要放置同样的数据时,可用DUP操作符,一般格式为:COUNTDUP(?);COUNT为重复的次数,?为要重复的数据。如:BUFFERDB100DUP(0);表示以BUFFER为首地址的100个字节中存放00H数据BUFFER1DB100DUP(3,5,2DUP(10),35),24,NUM,42,2020/5/11,3.2.2符号定义伪指令,等值伪指令EQU给左边符号定义一个值。该值可以是任何有效的操作数表达式,如一个常数、另一个符号名或地址表达式,甚至一个指令助记符。在程序中,凡是出现该符号的地方,汇编时均用该值代替。如:TIMESEQU50;TIMES=50FIRSTEQUSECOND+1;FIRST=SECOND+1ADD1EQUADD;为ADD指定一个别名ADD1ORG100HABCDB41H,42H,43H,44HXYZEQUABC+2,43,2020/5/11,解除伪指令PURGE用于释放由EQU伪指令定义的符号变量,这样这些变量就可以被重新定义。EQU伪指令定义的符号在PURGE伪指令解除前,不能重新定义。例:PURGE符号名1,符号名2,符号名N等号赋值伪指令“=”功能与EQU相似,能对已定义的符号名重新定义而无须先释放。TIMES=50;FIRST=SECOND+1;ADD1=ADD;,44,2020/5/11,3.2.3段定义伪指令,一个完整的汇编源程序由代码段、堆栈段、数据段,有时还有附加段所组成。段定义伪指令可将源程序划分成若干段,以便汇编和连接时将各同名段进行组合。段定义伪指令一般格式为:段名SEGMENT定位类型组合类型类别;段体内容,由指令及伪指令组成。段名ENDSSEGMENT和ENDS应成对使用,缺不可。,45,2020/5/11,段名:段名是不可省略的,是给定义的段所起的名称。例如:STACKSEGMENTSTACKDW20DUP(?)STACKENDS定位类型:表示该段起始地址位于何处。字节型(BYTE),段起始地址可位于任何地方;字型(WORD),段起始地址必须位于偶地址;节型(PARA),即段起始地址必须能被16除尽;页型(PAGE),即段起始地址可被256除尽);缺省时,段起始地址便定位为PARA型的。,46,2020/5/11,组合类型:组合类型用于告诉连接程序,该段和其它段的组合关系。连接程序可以将不同模块的同名段进行组合。组合类型有:NONE表明本段与其它段逻辑上不发生关系,省略时,便指定为这一组合类型。PUBLIC与其它模块中用PUBLIC说明的同名段按先后连接成一个逻辑段,使用同一个物理段地址。STACK将具有STACK类型的同名段连接成一个大的堆栈,由各模块共享。,47,2020/5/11,COMMON与其它模块中由COMMON说明的所有同名段连接时,被重叠放在一起,其长度是同名段中最长者的长度。MEMORY由MEMORY说明的段。在连接时,它被放在所装载程序的最后存储区(最高地址)。若几个段都有MEMORY组合类型,则连接程序只认定首先遇到的段具有MEMORY组合类型,其它段则认为是COMMON类型,并被叠放在一起。AT表达式段地址是表达式所给定的值。在程序中就可由用户直接来定义段地址。但这种方式不适用于代码段。,48,2020/5/11,类别:是用单引号括起来的字符串,以表明该段的类别。如代码段(CODE)、数据段(DATA),堆栈段(STACK)等。各模块中同一类型的段可能具有不同的名字,连接时将同类别的段(但不一定同名)放在连续的存储区内。上述的组合类型便于多个模块的连接。若程序仅有一个模块,即只包括代码段、数据段和堆栈段时,为了和其它段有区别,除了堆栈段用STACK说明外,其它段的组合类型、类别均可省略。,49,2020/5/11,例如有两个模块:模块1STACKSEGMENTSTACKDW300DUP(?)STACKENDSDATASEGMENTCOMMON;重叠DATAENDSCODESEGMENTPUBLIC;先后连接CODEENDS模块2STACKSEGMENTSTACK;同类成一个大堆栈DW30DUP(?)STACKENDSDATASEGMENTCOMMONDATAENDSCODESEGMENTPUBLICCODEENDSEND,50,2020/5/11,3.2.4设定段寄存器伪指令,ASSUME段寄存器定义伪指令。用于建立段名和段寄存器之间的严格对应关系。可通知汇编程序哪一个段寄存器是当前段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。其格式为:ASSUME段寄存器:段名,段寄存器:段名,ASSUME伪指令只是指明某一个段地址与段寄存器的联系,没有将段地址送入该寄存器的操作。因此要将段地址装入段寄存器还需用汇编指令来实现。,51,2020/5/11,例如:CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKMOVAX,DATA;DATA段值送AXMOVDS,AX;AX内容送DS,本指令执行完之后,DS才为实际段值CODEENDS由于DOS的装入程序负责把CS初始化成正确的代码段地址,SS初始化为正确的堆栈段地址,在程序中就不必设置。但DS数据段或ES附加段必须MOV指令对DS和ES进行初始化,以装入段地址。,52,2020/5/11,3.2.7ORG伪指令,ORG伪指令用于指定段内程序或数据代码存放的起始偏移地址,即用语句中表达式的值作为起始偏移地址,此后的程序或数据代码将连续存放,除非遇到另一个新的ORG语句。一般格式为:ORG例如:DATASEGMENTBUFF1DB23,56H,EOFORG2000HBUFF2DBSTRINGDATAENDS,53,2020/5/11,3.2.5定义过程的伪指令,54,2020/5/11,3.2.8汇编结束伪指令,END伪指令表示源程序的结束。每个源程序模块必须且只能用一条END伪指令指明结束位置,汇编程序遇到END时立刻停止汇编。其一般格式为:END表达式其中表达式是可选项,表示该汇编程序模块的启动地址。例如:ENDSTART则表明该程序的启动地址为START。,55,2020/5/11,程序设计是应用计算机解决实际问题的重要环节。一个优秀的程序设计的标准为:程序结构清晰合理,易于理解和维护;程序执行时间短;源程序的语句行少;程序存储的字节数少;这些要求可通过选择算法和优化程序结构来实现。,3.3汇编语言程序设计,56,2020/5/11,3.3.1汇编语言程序设计概述一、汇编语言程序的基本结构框架汇编语言源程序由可执行的指令语句和指示性的伪指令组成。在汇编语言源程序至少包括三段:代码段、数据段、堆栈段,必要时还有附加段。,57,2020/5/11,二、汇编语言程序设计的基本步骤1.分析实际问题,建立解决问题的模型;2.确定解决问题的算法、方法和步骤;3.根据算法画出程序流程图,即将解决问题的思路用图形表示。4.对程序中的数据的组织、存储单元分配、寄存器使用规划等进行统一考虑和安排。5.根据程序流程图编写程序;6.程序检查、调试与修改;,58,2020/5/11,三、汇编语言程序的基本结构程序根据Boehm和Jacobi的结构定理,任何程序可以由三种最基本的结构程序构成,如下图:顺序结构程序分支结构程序循环结构程序,每个结构程序只有一个入口和一个出口,通过三种结构的组合和嵌套可构成任何复杂的结构化程序。,59,2020/5/11,3.3.2顺序结构程序设计,顺序程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP自动增加的顺序进行。例1:利用查表法计算平方值。已知09的平方值连续存在以SQTAB开始的存储区域中,求SUR单元内容X的平方值,并放在DIS单元中。假定0X9且为整数。解:(1)了解平方表的存放位置;(2)根据X的值,找到X对应X2在表中位置。,60,2020/5/11,STACKSEGMENTDB100DUP(?)STACKENDSDATASEGMENTSURDB?DISDB?SQTABDB0,1,4,9,16,25,36,49,64,81DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATA,61,2020/5/11,BEGIN:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXLEABX,SQTAB;取平方表基地址MOVAH,0MOVAL,SUR;AL=XADDBX,AX;计算地址偏移MOVAL,BX;取出X的平方值MOVDIS,ALRETCODEENDSENDBEGIN,62,2020/5/11,BEGIN:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXLEABX,SQTABMOVAL,SUR;AL=XXLATSQTABMOVDIS,ALRETCODEENDSENDBEGIN,为使程序精练,可采用换码指令XLAT,代码段如下:,63,2020/5/11,3.3.3分支结构程序设计分支结构程序的基本思想是根据某些条件和状态来控制程序下一步的走向。首先执行能影响状态的指令,如算术逻辑运算指令、移位指令或位操作指令,然后用条件转移类指令对各种状态标志进行判断,进而转移形成分支。设计分支结构程序一般有两种方法:比较/测试分支结构法跳转表分支结构法,64,2020/5/11,1.比较/测试分支结构法采用比较指令CMP和测试指令TEST,产生相应的状态标志,选择适当的条件转移指令,实现不同情况的分支转移。一条转移指令产生两路分支,n条转移指令可产生n+1条分支。,65,2020/5/11,根据上述要求的程序段为:START:MOVAX,BUFFER;取变量XORAX,AX;产生状态标志JEZERO;X=0则转移JNSPLUS;X=1则转移MOVBX,0FFFFH;BX=1JMPCONT1;转向出口ZERO:MOVBX,0JMPCONT1PLUS:MOVBX,1CONT1:,66,2020/5/11,2.跳转表分支结构法当分支数较多时,将各个分支的入口地址组成跳转表,再根据某个变量的不同取值情况,从表中取出相应的入口地址,实现各分支转移。例2:根据AL中各位被置位情况,控制转移到8个子程序P1P8其中之一。,67,2020/5/11,STACKSEGMENTDB100DUP(?)STACKENDSDATASEGMENTBASEDWSR0,SR1,SR2,SR3,SR4,SR5,SR6,SR7VALXDB?DATAENDS,解:具体程序如下:,68,2020/5/11,CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:PUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXLEABX,BASEINAL,PORTGETBIT:RCRAL,1JCGETADINCBXINCBXJMPGETBITGETAD:JMPWORDPTRBXRETCODEENDS,69,2020/5/11,CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVAL,VALXMOVAH,0DECAXSALAX,1LEABX,BASEADDBX,AXJMPWORDPTRBXSR0:JMPGETADSR1:JMPGETADGETAD:MOVAH,4CHINT21HCODEENDS,70,2020/5/11,若跳转表中的内容由JMPOPRD转移指令构成,则不能将跳转表的内容作为转移的目标地址直接取出。先根据给定的参数值第一次跳转到表中的对应项,然后执行跳转表中的JMPOPRD转移指令,第二次跳转到对应的子程序段。注意:跳转表中每一条跳转指令占三个字节。第一次跳转的目标地址在BX中,JMPBX。跳转表中是JMPOPRD转移指令,故跳转表在代码段中。,71,2020/5/11,STACKSEGMENTDB100DUP(?)STACKENDSDATASEGMENTVALXDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVBL,VALX;取控制参数MOVBH,0DECBX;控制参数减一MOVAX,BX;暂时保存SALBX,1;左移乘二ADDBX,AX;加上原数,完成乘三,72,2020/5/11,ADDBX,OFFSETTABLE;加上表首址JMPBX;第一次跳到跳转表中的对应项TABLE:JMPSR0;JMPSR1;在代码段中的跳转表,JMPSR2;进行第二次跳转,执行跳转表中;的转移指令。JMPSR7;SR0:JMPGETADSR1:JMPGETADGETAD:MOVAH,4CHINT21HCODEENDS,73,2020/5/11,3.3.4循环结构程序设计在实际应用中,要求某个操作重复执行多次,可利用循环程序结构,来减少源程序的长度。循环结构程序通常由以下几个部分组成:1循环初始化部分:地址指针、循环次数、相关寄存器及标志的清零和设置。2循环体:循环体是要求重复执行的程序段部分。3循环体修改部分:每进行一次循环由该部分修改地址指针或其他循环参数。4循环控制部分:判断控制循环的条件是否满足。以决定是否继续循环。5循环结束部分:进行循环的后续处理,如保存循环运行结果等,这部分不是必须的。,74,2020/5/11,循环程序有两种结构形式:1.DO-WHILE结构,先判断后执行循环体。DO-UNTIL结构,先执行循环体后判断。DO-WHILEDO-UNTIL,75,2020/5/11,例7软件延时程序(多重循环)DELAYPROCTIME:MOVDX,3FFHTIME1:MOVAX,0FFFFHTIME2:DECAX;NOP;JNZTIME2;内层循环DECDXJNZTIME1;外层循环DECBXJNZTIME;最外层循环RETDELAYENDPBX是入口参数,可由BX控制延时时间。如:假定DELAY是延时100ms程序,则延时10s的程序可写为:MOVBX,100CALLDELAY;延时10秒,76,2020/5/11,例8在DS所决定的数据段,从偏移地址BUFFER开始顺序存放100个无符号16位数,现要编写程序将这100个字数据从大到小排序。气泡算法排序(从大到小或从小到大)从第一个数开始依次对相邻两个数比较,若次序对,则不做任何操作,如次序不对,则使这两个数交换位置。这种算法称为气泡算法。序号数第一遍第二遍第三遍第四遍188163284251632843231632841616432848885845555第一遍进行4(N-1次)比较,最小数已到最下面,第二遍进行3(N-2次)比较,依次类推,最多进行N-1遍即可完成排序。,77,2020/5/11,AX,SI,78,2020/5/11,程序如下:LEADI,BUFFER;取首地址MOVBL,99;须经N-1次排序NEXT0:MOVSI,DI;SI恢复指向首地址MOVCL,BL;每次排序的比较次数NEXT3:MOVAX,SI;当前16位数放在AX中ADDSI,2;SI指向下一个16位数CMPAX,SI;当前数与下一个数比较JNCNEXT5;大于等于则不交换MOVDX,SI;小于则交换MOVSI2,DX;可XCHGSI,AXMOVSI,AX;MOVSI-2,AXNEXT5:DECCL;计算比较次数JNZNEXT3DECBL;每次排序的比较次数减一JNZNEXT0HLT,79,2020/5/11,LEADI,BUFFER;取首地址MOVCOUNT,100;排序元素的个数CLD;地址递增排序NEXT1:MOVBX,1;交换标记DECCOUNT;每次排序的比较次数减一JZEXIT;比较次数为0则结束MOVSI,DI;SI恢复指向首地址MOVCX,COUNT;每次排序的比较次数NEXT2:LODSW;当前数AX,SI下一个数CMPAX,SI;当前数与下一个数比较JNCNEXT3;大于等于则不交换XCHGSI,AX;小于则交换MOVSI2,AX;大数存入上一位置XORBX,BX;有交换则交换标记清零NEXT3:LOOPNEXT2;一次排序是否结束?CMPBX,0;一次排序是否有交换?JENEXT1;有交换则继续EXIT:MOVAX,4C00HINT21H,80,2020/5/11,3.3.5子程序设计,子程序是常用的程序结构,将频繁使用的功能写成子程序的形式,可使源程序及目标程序缩短,提高效率和可靠性。在8086/8088中,子程序和过程的含义是一致的。主程序可多次调用一个或多个子程序;子程序可被多个主程序调用,也可再调用其他子程序;子程序调用子程序,称子程序嵌套;调用自己称递归调用;子程序调用时,CPU自动将调用时的断点压入堆栈保存;子程序调用时,由程序将要用到寄存器内容压入堆栈保护;子程序返回前,将压入堆栈的寄存器内容弹出,恢复现场;,81,2020/5/11,编写子程序有以下几点基本要求:1.子程序必须有一定的通用性,确定入口参数和出口参数。2.选用适当的方法进行主程序和子程序间参数的传递。利用寄存器进行参数传递。例9利用存储单元按事先约定的规则进行参数传递。利用堆栈进行参数传递。例103.注意现场信息的保护和恢复,最好在子程序中进行保护。4.正确使用堆栈。子程序嵌套较多时,使用堆栈要仔细。5.编制子程序文件,主要包括以下内容:子程序的名称;子程序的功能描述;子程序的入口参数和出口参数;子程序所使用的寄存器和存储单元列表,对其作用描述;本子程序所调用的其他子程序列表;子程序调用形式举例;,82,2020/5/11,例9两个6字节数相加。程序如下:DATASEGMENTADD1DB0FEH,86H,7CH,35H,68H,77HADD2DB45H,0BCH,7DH,6AH,87H,90HSUMDB6DUP(0)COUNTDB6DATAENDSSTACKSEGMENTDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKMADD:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AX,83,2020/5/11,MOVSI,OFFSETADD1MOVDI,OFFSETADD2MOVBX,OFFSETSUMMOVCX,COUNTCLCAGAIN:CALLSUBADDLOOPAGAINMOVAX,4C00HINT21HSUBADDPROC;完成一个字节相加PUSHAX;入口参数:SI,DI,BXMOVAL,SI;出口参数:SI,DI,BXADCAL,DIMOVBX,ALINCSIINCDIINCBXPOPAXRETSUBADDENDPCODEENDSENDMADD,84,2020/5/11,例12数的阶乘n*(n1)!按照阶乘的定义n!=这是一个递归定义式,1在程序设计时,可采用子程序的的递归调用形式。DATASEGMENTNUMDB5FNUMDW?DATAENDSSTACKSEGMENTDB100DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:PUSHDSMOVAX,0PUSHAXMOVCX,1PUSHCXMOVAH,0MOVAL,NUM,85,2020/5/11,CALLFACTORMOVFNUM,AXPOPCXMOVAX,4C00HINT21HFACTORPROCCMPAX,0JNZIIAMOVDL,1RETIIA:PUSHAXDECALCALLFACTORIIA1:POPCXMULCL;CALLMULTIIA2:MOVDX,AXRETFACTORENDPCODEENDSENDBEGIN,86,2020/5/11,8086/8088系统中,有一组DOS功能的调用程序。这组功能调用涉及内容很多,这里介绍系统功能调用中常用的基本输入输出调用。系统功能调用要注意三个方面:(1)入口参数;(2)功能调用号要送入AH;(3)执行INT21H。,3.3.6DOS功能调用,87,2020/5/11,1键盘输入(1号调用)入口参数:AH=1出口参数:AL=相应字符的ASCII码。形式:MOVAH,1INT21H2控制台输入但无显示(7号调用)入口参数:AH=7出口参数:AL=相应字符的ASCII码。形式:MOVAH,7INT21H该调用与1号调用功能相似,区别仅在输入字符不在显示器上显示。往往用于输入密码等。,88,2020/5/11,3字符串输入(10号调用)入口参数:AH=10,DS:DX键盘接收输入缓冲区首地址出口参数:从键盘接收字符串到内存缓冲区。缓冲区第一个字节存储缓冲区能容纳的字符个数,第二个字节存放实际接收的字节数,从第三字节开始存放从键盘接收的字符。形式:MOVAH,10MOVDX,OFFSETBUFFINT21H4字符输出(2号调用)入口参数:DL=显示字符的ASCII码,AH=2出口参数:无形式:MOVAH,02MOVDL,30HIN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 靴的金属附件行业深度研究报告
- 中国摇奖机项目投资可行性研究报告
- 象鼻子刀行业深度研究报告
- 2025电梯设备采购合同范本
- 课本中的故事启发了我读后感14篇
- 质量控制流程标准化文档行业版
- 客户管理信息系统与报表模板
- 卫生医疗行业患者权益保证承诺书9篇
- 抒情散文:赏月之情(13篇)
- 人力资源管理流程优化实践流程工具
- 2025至2030年中国白银深加工行业供需态势分析及市场运行潜力报告
- 国家公园考试题型及答案
- 三维城市建模技术-洞察及研究
- 五粮液国庆茅台活动方案
- 日语入门考试试题及答案
- 慢性便秘检查与评估中国专家共识(2024版)解读
- T/CGCC 14-2018无形资产价值评价体系
- T/CBMCA 022-2021陶瓷岩板加工规范
- 调研基层武装部工作报告
- 三级医院评审标准实施细则(2023 年版)
- (高清版)TSG 09-2025 缺陷特种设备召回管理规则
评论
0/150
提交评论