汇编语言指令的构成

上传人:z****2 文档编号:204397611 上传时间:2023-04-26 格式:DOCX 页数:30 大小:89.83KB
返回 下载 相关 举报
汇编语言指令的构成_第1页
第1页 / 共30页
汇编语言指令的构成_第2页
第2页 / 共30页
汇编语言指令的构成_第3页
第3页 / 共30页
点击查看更多>>
资源描述
第一讲第四章 汇编语言程序设计-语句特点、伪指令回顾:8086/8088 的内部结构、寄存器功能和工作过程,指令格式、 寻址方式和功能。重点和纲要:汇编语言程序设计-语句特点、伪指令(了解汇编的概念及其方法 , 掌握汇编程序的基本格式,常用运算符的使用方法,汇编的步骤。了解伪指令的功能,掌握定义数据、符号、段、过程等伪指令的使用方法,能编写格式正确的汇编程序)。教学方法、实施步骤时间分配教学手段回顾5”X2板书 计算机 投影仪 多媒体课件等讲授40” X2提问3” X2小结2” X2讲授内容:4.1 汇编语言的基本元素一、汇编语言的语句格式由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。每个语 句由 14 个部分组成,其格式是:标号 指令助记符 操作数;注解其中用方括号括起来的部分,可以有也可以没有。每部分之间用空格(至少一 个)分开,一行最多可有 132 个字符。1标识符是给指令或某一存储单元地址所起的名字。可由下列字符组成:字母:Az ; 数字:09 ; 特殊字符:?、一、$。数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。标识符最长 为 31 个字符。当标识符后跟冒号时,表示是标号。它代表该行指令的起始地址; 当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。2指令助记符表示不同操作的指令 可以是8088的指令助记符,也可以是伪指令。 3操作数是指令执行的对象。依指令的要求,可能有一个、两个或者没有, 例如: RET ;无操作数COUNT: INCCX ;一个操作数如果是伪指令,则可能有多个操作数,例如:COST DB3, 4, 5, 6, 7 ;5 个操作数MOVAX, BP 十 4;第二个操作数为表达式4注解 该项可有可无,是为源程序所加的注解,用于提高程序的可读性。二、汇编语言的运算符 1算术运算符、逻辑运算符和关系运算符 算术运算符可以应用于数字操作数,结果也是数字。而应用于存储器操作 数时,只有、 运算符有意义。2取值运算符 SEG、 OFFSET、 TYPE、 SIZE 和 LENGTH SEG和OFFSET分别给出一个变量或标号的段地址和偏移量。 例如,定义: SLOT DW 25则:MOV AX, SLOT;从SLOT地址中取一个字送入AXMOV AX,SEG SLOT; 将 SLOT所在段的段地址送入AXMOV AX,OFFSET SLOT; 将 SLOT所在段的段内偏移地址送AX TYPE操作符返回一个表示存储器操作数类型的数值各种存储器地址操作数类字节1字2双字4NEAR1FAR2表 3-1 存储器操作数的类型属性及返回值型部分的值如表 3-1 所示。 LENGTH和SIZE操作符只应用于数据存储器操作数。(用 DB/DW/DD 等定义的操作数)LENGTH返回一个与存储器地址操作数相联系的单元数, SIZE操作数返回一个为存储器操作数分配的字节数。例如:若 MULT-WORD DW 50DUP(0)则 LENGTH(MULT-WORD)=50SIZE(MULT-WORD)=100注意:SIZE (X) = (LENGTH X) * (TYPE X)3属性运算符属性运算符用来给指令中的操作数指定一个临时属性,而暂时忽略当前的属 性。常用的有:(1) 合成运算符 PTR它作用于操作数时,则忽略了操作数当前的类型(字节或字)及属性(NEAR或 FAR),而给出一个临时的类型或属性,一般格式类型PTR 表达式功能:建立一个存储器地址操作数,它与其后的存储器地址操作数有相同的 段地址偏移量,但有不同的类型。例如: SLOT DW 25此时SLOT已定义成字单元。若我们想取出它的第一个字节内容,则可用PTR 对其作用,使它暂时改变为字节单元,即MOV AL, BYTE PTR SLOT三、表达式是由运算符和操作数组成的序列,在汇编时产生一个确定的值。这个值可以仅表示一个常量,也可以表示一个存储单元的偏移地址,相应的表达式称为常量表 达式和地址表达式。1常数汇编语言语句中出现的常数可以有 7种: 二进制数后跟字母B,如01000001B。 八进制数后跟字母Q或0,如202Q或2020。 十进制数 后跟D或不跟字母,如85D或85。 十六进制数 后跟H,如56H,0FFH。注意,当数字的第一个字符是AF 时,在字符前应添加一个数字 0,以示和变量的区别。另有,十进制浮点数、十六进制实数、字符和字符串2常量操作数常量操作数是一个数值操作数,一般是常量或者是表示常量的标识符可以为数字常量操作数或字符串常量操作数。前者可采用二进制、八进制、十进制或十六进制等计数形式;而后者则为相应字符的ASCII码。3存储器操作数存储器操作数是一个地址操作数,代表一个存储单元的地址,通常以标识符 的形式出现存储器操作数可以分为变量及标号两者类型,如果存储器操作数所代表的是 某个数据在数据段、附加段或堆栈段中的地址,那么这个存储器操作数就称为变 量;如果存储器操作数所代表的是某条指令代码在码段中的地址,那么这个存储 器操作数称为标号。变量所对应的存储单元内容在程序的运行过程中是可以改变 的,标号通常作为转移指令或调用指令的目标操作数,在程序运行过程中不能改 变。存储器操作数有三个方面的属性。(1) 段地址:即存储器操作数所对应的存储单元所在段的段地址;(2) 偏移地址:即存储器操作数所对应的存储单元在所在段内的偏移地址;(3) 类型:变量的类型是相应存储单元所存放的数据项的字节数;而标号的 类型则反映了相应存储单元地址在作为转移或调用指令的目标操作数时的寻址 方式,可有两种情况,即 NEAR和FAR。具体值可见表3-14常量表达式由常量操作数及运算符构成在汇编时产生一个常量如 PORT、VAL 十 1、OFFSET SUM、SEG SUM、TYPE CYCLE 等。5地址表达式由存储器操作数与运算符构成,必须有明确的物理意义例如 SUM2、 CYCLE5表达式 SUM2、 CYCLE5 的值仍然是一个存储器操作数,该存储器操作数的 段地址与类型属性分别与存储器操作数SUM及CYCLE相同,但偏移地址分别比 SUM及CYCLE大2或小5。表达式是在汇编时计算的,而变量单元的内容在程 序的运行过程中可以改变。四、汇编语言程序汇编步骤 汇编语言程序要能在机器上运行,还必需将汇编源程序汇编成可执行程序。 为此必须完成以下几个步骤。 过程如图 3-1 所示。1编辑源程序 2调用宏汇编对源程序进行汇编 3对目标程序进行连接 4运行可执行程序并调试4.2 伪指令伪指令用来对汇编程序进行控制,对程序中的数据实现条件转移、列表、存 储空间分配等处理,其格式和汇编指令一样,但一般不产生目的代码,即不直接 命令 CPU 去执行什么操作。一、定义数据伪指令该类伪指令用来定义存储空间及其所存数据的长度。 DB:定义字节,即每个数据是1个字节。 DW:定义字,即每个数据占1个字(2个字节)。 DD:定义双字,即每个数据占2个字。低字部分在低地址,高字部分在高 地址。 DQ:定义4字长,即每个数据占4个字。 DT:定义10个字节长,用于压缩式十进制数,例如: DATA1 DB 5, 6, 8, 100DATA2 DW 7, 287TABLE DB ? ;表示在 TABLE 单元中存放的内容是随机的 当一个定义的存储区内的每个单元要放置同样的数据时,可用 DUP 操作符。 一般格式COUNT DUP (?), COUNT为重复的次数,“()”中为要重复 的数据。女如BUFFER DB 100DUP(0);表示以BUFFER为首地址的100个字节 中存放 00H 数据BUFFER1 DB 100 DUP(3, 5, 2DUP(10), 35), 24,NUM) 想一想存储区的情况?二、符号定义伪指令EQU、=、及PURGE EQU 伪指令给符号定义一个值。在程序中,凡是出现该符号的地方,汇编时均 用其值代替,如:TIMES EQU 50DATA DB TIMES DUP(?)上述两个语句实际等效于如下一条语句:DATA DB 50 DUP(?) “ = ”伪指令可给初始变量赋值。如: COUNT=100 ;COUNT=100TIME=50;TIME=50 PURGE 伪指令用于释放由 EQU 伪指令定义的变量,使这些变量可以被重新定 义。PURGE TIMES ; 释放 TIMES 变量TIMES EQU 2 ; 重新定义三、段定义伪指令SEGMENT和ENDS一般来说,一个完整的汇编源程序由3 个段组成,即堆栈段、数据段和代码 段。段定义伪指令可将源程序划分成若干段,以便生成目的代码和连接时将各同 名段进行组合。段定义伪指令一般格式为:段名 SEGMENT 定位类型 组合类型 类别段名 ENDSSEGMENT 和 END5 应成对使用,缺不可。其中段名是不可省略的。其它是 可选项,是赋予段名的属性,可以省略。例如: DATA SEGMENTDW 20DUP(?)DATA ENDS四、设定段寄存器伪指令 ASSUME一般格式 ASSUME段寄存器:段名,段寄存器:段名, 功能:通知汇编程序,哪一个段寄存器是该段的段寄存器,以便对使用变量或标 号的指令汇编出正确的目的代码。在段名中, CODE 表示代码段, DATA 表示数据段, STACK 表示堆栈段。由于 ASSUME 伪指令只指明某一个段地址应存于哪一个段寄存器中,并没有 包含将段地址送入该寄存器的操作。因此要将真实段地址装入段寄存器还需用汇 编指令来实现。这一步是不可缺少的。例如,code segmentASSUME CS:CODE, DS:DATA, SS:STACKmov ax, data ; data段值送 axmovds, ax ; ax内容送ds, ds才有实际段值coDE ENDs当程序运行时,由于 Dos 的装入程序负责把 cs 初始化成正确的代码段地 址, ss 初始化为正确的堆栈段地址,因此用户在程序中就不必设置。但是,在装 入程序中 Ds 寄存器由于被用作其它用途,因此,在用户程序中必须用两条指令 对 Ds 进行初始化,以装入用户的数据段地址。当使用附加段时,也要用 Mov 指令给 Es 赋段地址。五、定义过程的伪指令PROC和ENDP在程序设计中,可将具有一定功能的程序段看成为一个过程 (相当于一个子 程序),它可以被别的程序调用。一个过程由伪指令PROC和ENDP来定义,其格式为过程名 PRoc 类型过程体RET过程名 ENDP其中过程名是为过程所起的名称,不能省略,过程的类型由far(远过程, 为段间调用)和near (近过程,在本段内调用)来确定,如果缺省类型,则该 过程就默认为近过程。endp表示过程结束。过程体内至少应有一条ret指令, 以便返回被调用处。过程可以嵌套,也可以递归使用。例如一个延时 100ms 的子程序,其过程可定义如下,DELAY pRocpUsH BxpUsH cxMov BL, 10;延时10ms,改变bl和CX中的值,即可改变延时时间。AGAIN: Movcx, 2801 ;WAIT;LOOPWAITDECBLJNZAGAINPOPCXPOPBXRETDELAYENDPCALLDELAY;调用该过程远过程调用时被调用过程必定不在本段内。例如,有两个程序段,其结构如下:CODE1SEGMENTASSUMECS: CODE1FARPROCPROC FARRETFARPROCENDPCODE1ENDSCODE2SEGMENTASSUMECS: CODE2CALL FARPROC.CODE2 ENDSCODE1段中的FARPROC过程被另一段CODE2调用,故为远过程。六、 宏指令在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化程序书写, 该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,仍会产生源 程序所需的代码。宏指令的一般格式为 :宏指令名 MACRO形式参量表宏体ENDM例如: SHIFT MACROMOV CL,4SALAL,ClENDM这样定义以后,凡是要使al中内容左移4位的操作都可用一条宏指令shift 来代替。宏指令与子程序有许多类似之处。它们都是一段相对独立的、完成某种功能 的、可供调用的程序模块,定义后可多次调用。但在形成目的代码时,子程序只 形成一段目的代码,调用时转来执行。而宏指令是将形成的目的代码插到主程序 调用的地方。因此,前者占内存少,但执行速度稍慢;后者刚好相反。七、ORG 伪指令ORG伪指令规定了在某一段内,程序或数据代码存放的起始偏移地址。一般格式ORG v表达式例如: DATA sEGMENTBUFF1 DB 23 , 56H,EOFORG 2000HBUFF2 DB sTRiNGDATA ENDs上述变量定义中,BUFF1从DATA段偏移地址为0的单元开始存放,而BUFF2 则从DATA段偏移为2000H的单元开始存放,两者不是连续存放。八、汇编结束伪指令 END该伪指令表示源程序的结束令汇编程序停止汇编。因此,任何一个完整的 源程序均应有END指令。一般格式 END 表达式其中表达式表示该汇编程序的启动地址。例如:END sTART ;表明该程序的启动地址为 sTART。习题与思考:1下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图 VAR1 DB10,2VAR2 DW5DUP(?),0VAR3 DBHOW ARE YOU?,$VAR4 DD-1,1,02. 假定VARI和VAR2为字变量,LAB为标号,试指出下列指令的错误之处。(1)ADDVAR1, VAR2(2)SUB AL, VAR1(3)JMPLABSI(4)JNZVAR13. 对于下面的符号定义,指出下列指令的错误。A1DB ?A2DB 10K1EQU10241)MOVK1,AX( 2)MOVA1, AX( 3 )CMPA1,A2( 4)K1EQU20484. 数据定义语句如下所示:FIRST DB 90H, 5FH, 6EH, 69H SECOND DB 5 DUP(?)THIRD DB 5 DUP(?) FORTH DB 5 DUP(?)自 FIRST 单元开始存放的是一个四字节的十六进制数(低位字节在前),要求:(1)编一段程序将这个数左移两位、右移两位后存放到自SECOND开始的单元(注意保留 移出部分。(2)编一段程序将这个数求补以后存放到自FORTH开始的单元。5. 试编程序将内存从40000H到4BFFFH的每个单元中均写入55H,并再逐个单元读出比较, 看写入的与读出的是否一致。若全对,则将AL置7EH;只要有错,则将AL置81H。6. 在当前数据段 4000H 开始的 128 个单元中存放一组数据,试编程序将它们顺序搬移到 A000H开始的顺序128个单元中,并将两个数据块逐个单元进行此较;若有错将BL置00H; 全对则将BL置FFH,试编程序。第二讲:4.2 汇编程序设计(一)回顾:8086/8088 的指令系统,汇编程序的基本格式,伪指令的功能, 汇编程序的正确格式。重点和纲要:掌握汇编程序的分析与设计方法(包括分支程序和循环程序,设计思想,与高级语言的学习结合)教学方法、实施步骤时间分配教学手段回顾5”X2板书计算机 投影仪 多媒体课件等讲授40” X2提问3” X2小结2” X2讲述内容:一、 简单程序设计简单程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP内容 自动增加的顺序进行。例1利用查表法计算平方值。已知09的平方值连续存在以SQTAB开始的存 储区域中,求SUR单元内容X的平方值,并放在DIS单元中。假定0WXW 9 且为整数。分析:建立平方表,通过查表完成。STACK SEGMENTDB 100 DUP(?)STACK ENDSDATA SEGMENTSUR DB ?DIS DB ?SQTAB DB 0,1,4,9DATA ENDSCODE SEGMENTASSUME CS:CODE,DS BEGIN:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA BX,SQTABMOV AH,0MOV AL,SUR ;AL=XADD BX,AXMOV AL,BXMOV DIS,ALCODE ENDSEND BEGIN16,25,36,49,64,81 ; 09 的平方表DATA,SS:STACK,ES:DATA;保证返回 DOS,;为 DS 送初值;以下程序部分完成查表求平方值;亦可用查表指令完成(如下程序段)LEA BX, SQTABMOV AL, SURXLATMOV DIS, AL例2已知Z=(X+Y)-(W+Z),其中X, Y,乙 W均为用压缩BCD码表示的数, 写出程序。分析:这也是一种典型的直线程序,在这里要注意是 BCD 数相加,要进行十进制调整。具体程序如下:MOVAL,ZMOVBL,WADDAL,BLDAAMOVBL,AL; BL=(W+Z)MOVAL,XMOVDL,YADDAL,DL; AL=(X+Y)DAA;十进制调整SUBAL,BL; AL=( X+Y) -( Z+W)DAS十进制调整MOVZ, AL;结果送Z二、分支程序设计分支程序的基本思想是根据逻辑判断的结果 来形成程序的分支,如图,若 成立,则执行P1 否则执行P2。例 1 试编写程序段,实现符号函数。 分析:变量 X 的符号函数可表示为:1X00X=0-1 XvO程序可通过对符号标志的判别来确定执行哪一分支。START: MOVAX,BUFFER;(BUFFER)=XORAX,AXJEZERO;X = O,则转 ZEROJNSPLUS;X 为正数,则转 PLUSMOVBX,0FFFFH; X 为负数,则1 送 BXJMPCONT1ZERO:MOV BX,0JMP CONT1PLUS:MOV BX,1CONT1: 例 2 利用表实现分支根据 AL 中各位被置位情况,控制转移到 8 个子程序 P1P8 之一中去。转移表的结构如 表 3-2 所示。pi子程序R1的入口偏移地址P2子程序R2的入口偏移地址P3子程序R3的入口偏移地址P7子程序R7的入口偏移地址P8子程序R8的入口偏移地址表 3-2 子程序 R1 R8 的入口地址表分析:对于这种程序关键要找出每种情况的 转移地址,从图中可见 表地址=表基地址 +偏移量, 而偏移量可由 AL 各位所在位置*2 求得。DATASEGMENTBASEDW SR0, SR1, SR2, SR3SR4, SR5, SR6, SR7DATAENDSCODESEGMENTASSUMECS:CODE, DS:DATA, ESDATABEGIN:PUSH DS流程图见图 3-3。AX,XORAXPUSHAXMOVAX,DATA图 3-3 流程图MOVDS,LEABX,INAL,GETBIT:RCRAL,AXBASE ;表头送 BXPORT1 ;右移一位JCINCGETAD ;移出位是 1? BXINCBX ;修改指针GETAD:JMPJMPGETBIWORD PTRBX ;实现散转CODEENDSEND BEGIN根据跳转表构成方法不同,实现分支的方法也有所改变,下面有三个问题希望大 家思考:(1) 若跳转表地址由段值和偏移量四个字节构成,程序应如何实现?若跳转表中的内容由JMP OPRD指令构成,表的结构应如何组织、程序如何 实现?(3) 上述程序若不用间接跳转指令,而改为直接跳转,程序如何变动? 例3 将内存中某一区域的原数据块传送到另一区域中。 分析:这种程序若源数据块与目的数据块之间地址没有重叠,则可直接用传送或 串操作实现;若地址重叠,则要先判断源地址 +数据块长度是否小于目的地址, 若是,则可按增量方式进行,否则要修改指针指向数据块底部,采用减量方式传送。程序如下:DATASEGMENTSTR DB 1000DUP (?)STR1EQUSTR+7STR2EQUSTR+25STRCOUNT EQU 50DATAENDSSTACK SEGMENT PARA STACK STACKSTAPNDB100DUP(?)STACKENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKGOO PROCPUSH DSSUBAX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,STACKMOV SS,AXMOV CX,STRCOUNTMOV SI,STR1MOV DI,STR2CLDPUSH SIADD SI,STRCOUNT-1CMP SI,DIPOP SIJL OKSTDADDADDOK:REPSI,STRCOUNT-1DI,STRCOUNT-1MOVSBRETGOOCODEENDPENDS图 3-4 循环结构示意图END GOO三、循环程序设计循环程序是经常遇到的程序 结构,一个循环结构通常由以下 几个部分组成。1. 循环初始化部分。一般要进行操作。只有正确地进行了初始化设置,地址指针、循环次数及某标志 的设置,相关寄存器的清零等循环程序才能正确运行,及时停止。2. 循环体。是要求重复执行的程序段部分,对应于要求重复执行的操作。3. 循环控制部分。由该部分修改并判断控制循环的条件是否满足。以决定是否继续循环。4. 循环结束部分如保存循环运行结果等。循环程序有两种结构形式,一种是DOWHILE结构,另一种是DOUNTIL结构。前者把循环控制部分放在循环体的前面,先判断执行循环体的条件,满足 条件就执行循环体,否则就退出循环,如图 3-4(1)所示。而后者则是在执行循环 体之后,再判断循环控制条件是否满足,若满足条件,则继续执行循环操作,否 则,则退出循环。如图3-4(2)所示。DOWHILE结构的循环程序,其循环体有 可能并不执行,而DOUNTIL循环程序的循环体至少必须执行一次。例4设内存BUFF开始的单元中依次存放着30个8位无符号数,求它们的和并 放在 SUM 单元中,试编写程序。分析:这是一个求累加的程序。(设计思想同 C 语言)程序如下MOVSI,BUFF;设地址指针MOVCX,30;设计数初值XORAX,AX;设累加器初值AGAIN:ADDAL,SIADCAH,0INC SIDEC CXJNZ AGAIN ;循环累加MOV SUM,AX例4 在给定个数的 16 位数串中,找出大于零、等于零和小于零的个数,并紧 跟着原串存放。分析:这是一个统计问题,须设定三个计数器分别统计三种情况下的结果。程序 如下:DATA SEGMENTBUFF DW XI, X2, X3, ,XnCOUNT EQU $-BUFF ;此时, COUNT 的值为 BUFF 所占的字节数PLUSE DB ?ZERO DB ?MINUS DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATAASSUME ES:DATA, SS:STACKPLU:ZER:NEXT:MOVAX,DATAMOVDS,AXMOVCX,COUNTSHRCX,1;相当于除2,正好为BUFF中的数据个数MOVDX,0;设定计数器初值MOVAX,0;设定计数器初值LEABX, BUFFCMPWORD PTRBX, 0JAEPLU9大于等于 0,则转 PIUINCAH90,则统计JMPNEXTINCDH9;=0,则统计BEGIN:AGAIN:INC BXINC BXLOOP AGAINMOV PLUS,DLMOV ZERO,DHMOV MINUS,AHMOV AX,4C00HINT 21HCODE ENDSEND BEGIN习题与思考:1. 设变量单元A、B、C存放有三个数,若三个数都不为零,则求三个数的和,存放在D中; 若有一个为零,则将其余两个也清零,试编写程序。2. 有一个 100 个字节的数据表,表内元素已按从大到小的顺序排列好,现给定一元素,试 编程序在表内查找,若表内已有此元素,则结束;否则,按顺序将此元素插入表中适当的位 置,并修改表长。3内存中以FIRST和SECOND开始的单元中分别存放着两个16位组合的十进制(BCD码) 数,低位在前。编程序求这两个数的组合的十进制和,并存到以THIRD开始的单元。4.编写一段程序,接收从键盘输入的10 个数,输入回车符表示结束,然后将这些数加密后 存于BUFF缓冲区中。加密表为:输入数字:0, 1, 2, 3, 4, 5, 6, 7, 8, 9;密码数字:7, 5, 9, 1, 3, 6, 8, 0, 2, 4第三讲:4.3 汇编程序设计(二回顾:8086/8088 的指令系统,汇编程序的基本格式,伪指令的功能, 汇编程序的正确格式。分支程序和循环程序的设计方法。重点和纲要:掌握汇编程序的分析与设计方法(包括循环程序和子程序,复杂程序设计思想、调用)。教学方法、实施步骤时间分配教学手段回顾5”X2板书 计算机 投影仪 多媒体课件等讲授35” X2提问3” X2小结2” X2讨论5” X2讲述内容:三、 循环程序设计例 6 在 ADDR 单元中存放着 16 位数 Y 的地址,试编写一程序,把 Y 中 1 的个 数存入 COUNT 单元中。分析:这是一个循环统计的工作。采用 DOWHILE 结构,做 16 次循环,每次 将最高位移入CF中进行测试,先判断结果是否为0若为0则结束;否则统计 计数后循环重复。程序如下:DATA SEGMENTADDR DW NUMBERNUMBER DW YCOUNT DW ?DATA ENDSPROGRAM SEGMENTMAIN PROC FARASSUME CS:PROGRAM, DS:DATASTART:PUSHDSMOVAX, 0PUSHAXMOVAX, DATAMOVDS, AXMOVCX, 0;计数器初值=0MOVBX, ADDRMOVAX, BX;取Y送AXREPEAT:TESTAX, 0FFFFH;检测是否为全 0JZEXIT;是,则转 EXITJNSSHIFT;最高位是 0,则转 SHIFTINCCX;最高位是 1,则统计计数SHIFT:SHLAX, 1;处理下一位JMPREPEATEXIT:MOVCOUNT, CXRETMAINENDPPROGRAM ENDSEND START在实际应用中,有些问题较复杂,一重循环不够,必须使用多重循环实现,这些循环是一层套一层的,通常称为循环嵌套。例8 在DS所决定的数据段,从偏移地址BUFFER开始顺序存放100个无符号16位数,现要编写程序将这100个字数据从大到小排序。分析:排序的方法有很多,在这里,我们采用冒泡法。(该方法的设计思想在C语言程序设计中已学过,可提问学生。程序如下:LEA DI,BUFFERMOV BL,99;DI 作为指针,指向要排序的数据;循环控制初值NEXT0:MOV SI,DIMOV CL,BLNEXT3:MOV AX,SI;取一个数CMPAX,SIJNCNEXT5MOVDX,SIMOVSI-2, DXMOVSI,AXNEXT5:DECCLADD SI ,2;与下一个数进行比较;大于等于时转移;否则,两数交换;控制进行交换的次数JNZ NEXT3DEC BL ;修改交换的次数JNZ NEXT0HLT四、子程序设计子程序是程序设计中经常使用的程序结构,通过把一些固定的、经常使用的 功能做成子程序的形式,可以使源程序及目标程序大大缩短,提高程序设计的效 率和可靠性。对于一个子程序,应该注意它的入口参数和出口参。入口参数是由主程序 传给子程序的参数,而出口参数是子程序运算完传给主程序的结果。另外,子程 序所使用的寄存器和存储单元往往需要保护,以免影响返回后主程序的运行。主程序在调用子程序时,一方面初始数据要传给子程序,另一方面子程序运 行结果要传给主程序,因此,主子程序之间的参数传递是非常重要的。参数传递一般有三种方法实现(1) 利用寄存器。这是一种最常见方法,把所需传递的参数直接放在主程序的寄 存器中传递给子程序。(2) 利用存储单元。这种参数传递方法,把所需传递的参数直接放在子程序调用 指令代码之后。(3) 利用堆栈。这种方法将参数压入堆栈,在子程序运行时从堆栈中取参数。下面我们通过实例说明子程序设计及参数传递方法。例9两个 6 字节数相加。分析:将一个字节相加的程序段设计为子程序。主程序分3 次调用该子程序,但 每次调用的参数不同。程序如下:DATASEGMENTADD1DBFEH,86H,7CH,35H,68H,77HADD2DB45H,BCH,7DH,6AH87H90HSUMDB6DUP(0)COUNTDB6DATAENDSSTACK SEGMENTDB100DUP(?)STACKENDSCODESEGMENTASSUMECS: CODEDS: DATA, SS: STACKMADD:MOVAX,DATAMOVDS,AXMOVAXSTACKMOVSS,AXMOVSI,OFFSETADD1MOVDI,OFFSETADD2MOVBX,OFFSETSUMMOVCX,COUNT;循环初值为 6CLCAGAIN:CALL SUBADD;调用子程序LOOPAGAIN;循环调用6次MOVAX, 4C00HINT21H;子程序入口参数: SI, DI, BX出口参数: SI, DI, BXSUBADD PROC9完成一个字节相加PUSHAX;保护 AX 的值MOVAL, SI ;SI是一个源操作数指针ADCAL, DI ;DI是另一个源操作数指针MOVBX, AL;BX 是结果操作数指针INCSIINCDIINCBXPOPAX ;恢复 AX 的值RETSUBADD ENDPCODEENDSENDMADD例10 把内存中的字变量NUMBER的值,转换为4个ASCII码表示的十六进制 数码串,串的起始地址为 STRING。分析:把内存中的字变量NUMBER的值,转换为4个ASCII码表示的十六进制个子程序,由它完DATASEGMENTNUMBERDW25AFHSTRINGDB 4DUP (?), 0DHDATAENDSCODESEGMENTASSUMECS:CODE, DS:DATABEGIN:MOVAX, DATAMOVDS, AXMOVES, AXLEABX, STRINGPUSHBXPUSHNUMBERCALLBINHEXLEADI, STRINGMOVAH, 9INT21H数码串的工作设计成一个子程序,在这个子程序中再调用另成从BCD码到ASCII码的转换。程序如下:0AH,$;将参数(结果地址指针)压入堆栈;将源数据压入堆栈;调用子程序BINHEX PROCPUSH BPMOV BP,SPPUSH AXPUSH DIPUSH CXPUSH DXPUSHFMOV AX,BP+4MOV DI,BP+6ADDMOVMOVAGAIN: ANDCALL;以上为保护现场;取出 NUMBER;取出 STRING 的偏移地址DI, LENGTH STRING-1 ;使DI指向转换数据DX, AX;保护原始数据CX, 4AX, 0FH;取低4 位HEXD;调子程序STDSTOSB;保护转换数据PUSHCX;保护 CX 的值MOVCL,4SHRDX,CLMOVAX,DXPOPCXLOOPAGAINPOPFPOPDXPOPCXPOPDIPOPAXPOPBPRET4BINHEXENDPHEXDPROC;将AL中的BCD码转换成ASCII码CMPAL,0AHJLADDZADDAL,a-0-0AH;小写字母转换成 ASCII 码,若为大写ADDZ:ADDAL,0;字母,则再加 ADD AL,7RETHEXDENDPCODEENDSEDNBEGIN(以下例子作为选讲)例12数的阶乘1按照阶乘的定义n! = n*(n-1)!这是一个递归定义式,可采用子程序的的递归调用形式。程序如下 DATA SEGMENTNUMDB 5FNUMDW ?DATAENDSSTACK SEGMENTDB100DUP(?)STACK ENDSCODE SEGMENTSTACKASSUME CS:CODE,DS:DATA,SS:BEGIN:PUSHDSMOVAX,0PUSHAXMOVCX,1PUSHCXMOVAH,0MOVAL,NUMCALLFACTORMOVFNUM,AXPOPCXMOVAX,4C00HINT21HFACTORPROCCMPAX,0JNZIIAMOVDL,1RETIIA:PUSHAXDECALCALLFACTIIA1:POPCXMULCL;CALLIIA2:MOVDX,AXRETMULTFACTOR ENDPCODE ENDSEND BEGIN习题与思考:1.试编程序,统计由40000H开始的16K个单元中所存放的字符“A “的个数,并将结果存 放在DX中。2在当前数据段(DS),偏移地址为DATAB开始的顺序80个单元中,存放着某班80个同 学某门考试成绩。按要求编写程序: 编写程序统计三90分;80分89分;70分79分;60分69分,V60分的人数各 为多少,并将结果放在同一数据段、偏移地址为BTRX开始的顺序单元中。 试编程序,求该班这门课的平均成绩为多少,并放在该数据段的AVER单元中。3. 编写一个子程序,对AL中的数据进行偶校验,并将经过校验的结果放回AL中。4. 利用上题的予程序,对80000H开始的256个单元的数据加上偶校验,试编程序。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 毕设全套


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

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


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