版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4.1.1概述一、汇编语言的基本概念1、机器语言:由0、1代码所组成的语言。面向机器,同一组代码对不同的计算机表示不同的含义。2、汇编语言:由助记符表示的语言。面向机器。3、高级语言:用一些接近人们书写习惯的英语和数学表达式形式的句子编写程序。这种语言不面向机器,而是面向过程、面向对象。§4.1MASM宏汇编程序第四章汇编语言程序设计1二、汇编语言程序的结构形式例:在屏幕上显示字符串“GoodMorning!”DATA SEGMENT ;数据段MES DB‘GoodMorning!’ DB0DH,0AH,’$’DATA ENDSSTACK SEGMENT ;堆栈段ST1 DB200DUP(?)STACK ENDS2CODE SEGMENT ;代码段MAIN PROCFAR ASSUMECS:CODE,DS:DATA,SS:STACK
START: MOVAX,STACK MOVSS,AX
PUSHDS ;保护PSP段地址 MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX MOVDX,OFFSETMES MOVAH,9 INT21H
RET;返回到PSP开始处MAIN ENDPCODE ENDSEND START3PSP说明 用连接程序对目标程序(OBJ文件)进行连接和定位时,操作系统为每个程序建立了一个程序段前缀PSP,其长度为256字节。主要用于存放所要执行程序的有关信息,同时也提供了程序与操作系统的接口。在PSP的开始处(偏移地址0000H)安排了一条指令INT20H。执行该指令即可返回到DOS。DOS在建立了程序段前缀PSP后,就将要执行的程序从磁盘装入内存。在定位时,代码段在PSP之后,然后是数据段、堆栈段。在程序开始时,DS指向PSP所在段。ES也不指向用户的附加段,因此,在程序开始处,用指令将DS、ES、SS等指向用户所设计的段。(其中SS段可省略)45三、汇编语言的语句格式1、指令性语句是执行语句,以机器指令作基础,与机器指令相对应。汇编程序可将它翻译成目标代码(机器指令)。CPU可以执行。指令性语句只能出现在代码段中。语句格式:标号:指令助记符操作数,操作数;注释2、指示性语句(伪指令语句)是说明性语句。它没有对应的目标代码。汇编程序汇编源程序时对伪指令语句进行处理。它完成对数据的定义、段块定义、存储区分配等操作,完成汇编控制。语句格式:名字伪指令助记符操作数,操作数;注释64.1.2MASM宏汇编程序 汇编语言弥补了机器语言的不足,它用助记符来书写指令,地址、数据也可以用符号表示,与机器语言相比,编写、阅读、修改都比较方便,但它不能直接运行,必须将它翻译成机器语言CPU才能运行。执行翻译工作的程序,称为汇编程序。不同汇编程序对应的汇编语言语法、程序结构、书写方式、伪指令等都不同。一、基本汇编程序ASM 汇编程序是最早也是最成熟的一种系统软件,它除了能够将汇编语言源程序翻译成机器语言程序这一主要功能外,还能够根据用户的要求自动分配存储区域,包括程序区、数据区、暂存区等;自动把各种进制数转换成二进制数,把字符转换成ASCII7码,计算表达式的值等;自动对源程序进行检查,给出错误信息,如非法格式、未定义的助记符、标号、漏掉操作数等。具有这些功能的汇编程序称为基本汇编ASM(Assembler),能完成这种编译的程序称为基本汇编程序。二、宏汇编程序MASM 在基本汇编的基础上,进一步允许在源程序中把一个指令序列定义为一条宏指令,并包含有大量伪指令的汇编程序,叫做宏汇编MASM(MacroAssembler)。它包含全部基本汇编ASM的功能,还增加了宏指令、结构、记录等高级汇编语言功能。能完成这种编译的程序称为宏汇编程序。8§4.2汇编语言基本语法4.2.1语法基础一、字符集汇编语言程序中允许出现的字符为:英文字母:A~Z,a~z数字字符:0~9其它字符:+-*/()?…[]@<>.二、保留字保留字是由系统规定的,有特定含义的专用名字。汇编语言中的保留字有:寄存器的名字:AX、BX、CX、DX、SP、BP、SI、DI、IP、CS、DS、ES、SS指令助记符:MOV、PUSH、POP、ADD、SUB、MUL、…伪指令符:DB、DW、ASSUEM、EQU、LABEL、PROC等一些特殊的运算符与操作符:LT、EQ、OR、HIGH、SEG、OFFSET、PTR等94.2.2语句格式一般形式:[标识符]助记符[操作数1,操作数理2][:注释]例:START:MOVAX,DATAXDB1,2一、助记符助记符是语句的主体,对指令语句它是机器指令的助记符(指令的符号),对于伪指令它是伪指令符。二、标识符1、标号:用于指令语句中,代表相应语句的符号地址。位于代码段内,它具有三个属性:段值(SEGMENT):标号所在的段的段基址。段内偏移地址(OFFSET):标号地址与所在段的段首地址之间的偏移地址的字节数。10类型(TYPE):指在转移指令中标号可转移的距离。NEAR:近标,本段内引用,地址指针为2字节;FAR:远标,可在其它段内引用,地址指针为4字节。如果定义一个标号紧跟冒号,则表示此标号为近标。2、变量变量是存储区中数据区的名字,一方面代表所表示的值,另一方面代表相应的存储空间的地址。用作存储器操作数,直接寻址。它位于DS、ES段内。也具有三种属性:段值(SEGMENT):标号所在的段的段基址。段内偏移地址(OFFSET):变量地址与所在段的段首地址之间的偏移地址的字节数。类型(TYPE):指变量中每个元素所包含的字节数。类型有:字节(BYTE)、字(WORD)以及双字(DWORD)等。113、常量常量在汇编时已有确定的值。它没有属性。常量在程序中可以直接出现。二进制常量以B结尾,八进制以Q结尾,十六进制数以H结尾。十进制以D结尾(一般不写)。字符串常量用单引号表示。对于经常使用的常量,可以定义为符号常量。如: PI EQU3 PORT=218H三、操作数操作数是指寻址方式中所允许的数据类型。包括:常量、变量、标号、寄存器名以及表达式等。
四、注释以分号表示,用来说明一条指令或一段程序的功能,它可以省略。汇编程序对分号后的内容不汇编。加注释是为了让程序容易读懂。124.2.3MASM中的表达式
表达式由运算对象及运算符所组成。在汇编时由汇编程序对它进行运算。运算的结果作为一个语句的操作数去使用。运算对象可以是常数、变量或标号,运算结果可以是一个常数字,也可以是一个存储器的地址,在此地址中存放了数据(称为变量)或指令(称为标号)。MASM中使用了6类运算符:算术运算符逻辑运算符关系运算符数值返回运算符修改属性运算符其它运算符。131415一、算术运算符主要的算术运算有:+、-、*、/、MOD、SHL、SHR例:源程序指令格式如下:DAEQU300MOVAX,DA-80MOVBX,DAMOD100MOVCX,DA/100 MOVDH,01100100BSHR2汇编时,计算表达式形成指令为:DAEQU300MOVAX,220MOVBX,0MOVCX,3MOVDH,19H16二、逻辑运算符逻辑运算有:AND(与)、OR(或)、XOR(异或)、NOT(非)4种。逻辑运算符与逻辑运算指令一样,也是按位运算,它只能对常数进行运算,得到的结果也是常数。逻辑运算符作为操作数,处理是在汇编期间完成的,而逻辑指令作为指令助记符,它是在程序执行期间完成的。例: MOVAL,56H ANDAL,34HAND12H汇编时,计算表达式形成指令为: MOVAL,56H ANDAL,10H17三、关系运算符关系运算符有:EQ(等于)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于)。关系运算符的两个操作数必须是数据,或是同一段内的两个存储单元的地址。进行关系运算的比较操作后,结果是一个数值,若结果为真,输出全是1,即0FFH或0FFFFH。若结果为假,输出全是0。关系运算符一般与逻辑运算符组合起来使用。例:MOVAX,10HGT16ADDBL,6EQ0110B相当于:MOVAX,0ADDBL,0FFH以上三种运算符也叫做数值表达式。18四、数值返回运算符(分析运算符)用于分析一个存储器操作数的属性,并返回某个参数值。
1、SEG格式:SEG变量或标号。功能:获取变量或标号的段地址(段基值)。如:MOVAX,SEGDATA1MOVDS,AX等价于:MOVAX,DATAMOVDS,AX其中DATA1为DATA段内定义的一个变量名。如图所示DATA=6000H
60000H数据段DATA1192、OFFSET格式:OFFSET变量或标号功能:返回变量或标号的偏移地址。如: MOVBX,OFFSETDA1等价于:LEABX,DA1如图数据段,DA1的偏移为2000H因此,BX=2000H
在DOS的9号功能调用中经常用到此运算符。60000H数据段DATA162000H203、TYPE格式:TYPE变量或标号功能:TYPE加在变量前,返回变量类型属性。TYPE加在标号前,返回标号的距离属性值。214、LENGTH格式:LENGTH变量功能:依据数据定义伪指令后第一个表达式的形式而定。当伪指令为NDUP(?)时,取N;否则取1。225、SIZE格式:SIZE变量功能:SIZE加在变量前,取变量所包含的总字节数。算式:SIZE=LENGTH*TYPE。23五、修改属性运算符修改属性运算符也叫综合运算符、合成运算符、属性定义符等。1、段操作符格式:段前缀:变量或地址表达式功能:段前缀由段寄存器CS、DS、ES、SS之一加“:”,用来临时表示某个变量或地址被修改段前缀的段寄存器对的段基址中(段超越)。例:MOVAX,ES:[BX] ;段超越到ES段中2、PTR格式:类型/距离PTR变量或标号功能:将PTR左边的类型属性赋给右边的变量或标号。用来临时指定或修改变量或标号的类型属性。PTR本身不分配存储单元,仅给已分配的存储单元赋予新的属性。以保证运算时操作数类型的匹配。常与类型BYTE、WORD、NEAR、FAR等连用。24例4-13:N1DB45H,36HN2DW1122H,3344HLO:MOVAX,WORDPTRN1MOVBL,BYTEPTRN2执行结果:AX=3645H,BL=22H例4-14:MOV[BX],10H此指令将立即数10H送入BX间址指定的存储单元,但由于10H既可以是10H,也可以是0010H,所以汇编时认为错误。一般用BYTE或WORD指定:MOV[BX],BYTEPTR10H ;[BX]←10H MOVWORDPTR[BX],10H ;[BX]←00H,[BX+1]←10H253、THIS格式:变量/标号EQUTHIS类型/距离功能:将EQUTHIS右边的类型/距离属性,赋给左边的变量/标号,它的段地址和偏移地址与下一个存储单元的相同。例:FIRSTEQUTHISBYTETABLEDW1234H,5678HFIRST的偏移地址与TABLE的偏移地址相同,区别在于FIRST为字节类型,而TABLE为字类型。执行下列指令后,AX=1234H,BL=34HMOVAX,TABLEMOVBL,FIRST264、SHORT格式:SHORT标号功能:用来说明转移指令中目标地址的属性,目标地址与本指令的下一条指令的地址的距离在﹣128~+127之间,即限制在短转移范围内。短标号可以用在条件转移指令中,使用短标号的指令比使用近标号的指令少一个字节。275、HIGH和LOW格式:HIGH变量/标号格式:LOW变量/标号功能:字节分离符,对一个数或地址表达式,HIGH从中分离出高位字节,LOW从中分离出低位字节。例:K1EQU0ABCDHK2EQU1234HMOVAH,HIGHK1MOVBL,LOWK2等价于:MOVAH,0ABHMOVBL,34H28六、其它运算符其它运算符有(),[],<>,·,MASK和WIDTH等6种。1、园括号()圆括号用来改变运算符的优先级别,()中的运算符具有最高优先级。2、方括号[]主要用来表示地址表达式或多重变量的下标值。29七、运算符的优先级如果一个表达式同时具有多个运算符,则按以下规则运算:①优先级高的先运算,优先级低的后运算。②优先级相同时按表达式中从左到右的顺序运算。③括号可以提高运算符的优先级,括号内的运算总是在相邻的运算之前进行。各种运算符的优先级如下表:(数字越小,优先级越高)30运算符优先级次序表优先级运算符1()[]〈〉·LENGTH,WIDTH,SIZE,MASK2PTR,OFFSET,SEG,TYPE,THIS,CS:,DS:,ES:,SS:3HIGH,LOW4*,/,MOD,SHL,SHR5+,-6EQ,NE,LT,LE,GT,GE7NOT8AND9OR,XOR10SHORT31格式1:变量名助记符操作数,操作数,…;注释格式2:变量名助记符号nDUP(操作数,操作数…);注释用来定义一个变量的类型并分配存储单元。可赋初值也可不赋初值(用?代替)。常用符号:DBDWDDDFDQDT定义字节:1246810分配原则:低字(节)低地址,高字(节)高地址。在格式2中,n必须是正整数,表示括号中的操作数的重复次数,DUP后面必须带括号。§4.3指示性语句4.3.1数据定义伪指令32333435用伪指令DW和DD可以将变量或标号的偏移地址存入存储器,当用DD来定义时,原变量或标号的偏移地址存入低位字中,原变量或标号的段地址存入高位字中。36例:(接上页)DATASEGMENTXDW120PAR1DB‘AB’PAR2DW‘AB’ONEDWPAR1TWODWADR2THREEDDADR3DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXADR2:MOVAX,0ADR3:MOVBX,1HLTCODEENDSENDSSTART374.3.2表达式赋值语句一、赋值语句EQU格式:符号名EQU表达式功能:用于给变量、标号、常数、表达式等定义一个符号名。功能就是在程序中给符号名赋予表达式意义。同样的符号名不能重复定义。例:CR EQU0DHA1 EQUCR+02HPORT EQU218HC1 EQUADD;加法指令赋给符号名C1可以用PURGE可以解除某个符号名的赋值。PURGE C1;C1不再代替ADD。38二、等于语句=格式:符号名=表达式功能:“=”与EQU语句具有相同的功能,区别在于EQU不允许对同一符号名重新定义,而“=”则可以重新定义。例: N=100 MOVAX,N N=N-20 MOVCX,N ;若换成EQU则出错。39三、LABEL格式:名称LABEL类型功能:为LABEL语句下一行语句所使用的变量或标号取一别名并赋给新的类型。其中变量的类型为BYTE、WORD、DWORD等,标号的类型为NEAR、FAR。例: X LABELWORD M DB12H,34H MOVAL,M;AL=12H MOVBX,X;BX=3412HLABEL相当于EQUTHIS。404.3.3段定义语句一、段定义语句SEGMENT…ENDS格式:段名SEGMENT定位类型组合类型‘类别’ .逻辑段正文 段名ENDS功能:将一个逻辑段定义为一个整体。段名:是逻辑段的标识符,不能省略。它确定了逻辑段在存储器中的物理地址。“段名SEGMENT”和“段名ENDS”的段名必须一致。任何一个逻辑段必须以SEGMENT开始,以ENDS结束。
1、定位类型412、组合类型NONE、PUBLIC、COMMON、AT表达式、STACK和MEMORY等6种表明本段同其它段的组合关系。3、类别名典型的有:DATA、CODE和STACK等3种,连接时类别名相同的段存放在连续的存储区中。42二、段分配语句ASSUME8086中允许设置多个逻辑段,但只允许4个逻辑段同时有效。ASSUME用来将它们分别定义成代码段、数据段、附加段和堆栈段。格式:ASSUMECS:段名,DS:段名,ES:段名,SS:段名功能:定义4个逻辑段,明确段寄存器与指名段的关系。
ASSUME作为伪指令放在代码段的开始。也可用ASSUME段寄存器:NOTHING来取消前面所定义的段名。注意:ASSUME放在可执行程序开始位置的前面,指明段寄存器与段名之间的关系,但并未给段寄存器赋初值(CS除外)。程序中用户需要用指令将段名传送到对应的段寄存器中。例 两个16位无符号二进制数相乘的程序。43DATA SEGMENTD1 DW1234HD2 DW5678HP1 DW?P2 DW?DATA ENDSSTACK SEGMENT DB100DUP(?)STACK ENDS44CODE SEGMENTMAIN PROCFAR ASSUMECS:CODE,DS:DATA,SS:STACKSTART: MOVAX,STACK MOVSS,AX PUSHDS ;保护PSP段地址
MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AXL1: MOVAX,D1 MULD2 MOVP1,AX MOVP2,DX RET ;返回到PSP开始处MAIN ENDPCODE ENDS ENDSTART454.3.4过程定义伪指令在程序设计中,可将具有一定功能的程序段看成为一个过程(相当于一个子程序),它可以被别的程序调用。一个过程由伪指令PROC和ENDP来定义。格式:过程名PROC[NEAR]/FAR过程正文RETN过程名ENDP功能:定义一个过程,其它程序可以用CALL指令调用它。过程名:是给所定义的过程取的名字。它是主程序调用的目的操作数,即子程序的入口地址。它像标号一样具有三种属性:段属性、偏移地址属性、距离属性[NEAR/FAR]。RETN:返回指令,其中N表示返回时所丢弃的字节数(偶数)。464.3.5程序开始和结束语句一、NAME格式:NAME程序名功能:为源程序目标模块赋名字。二、ORG格式:ORG表达式功能:给汇编程序设置位置指针,指定下面语句的起始偏移地址。说明:一般情况下,段定义语句(SEGMENT)指出了段的起点,偏移地址为0。段内各个语句或数据的地址由段地址开始依次类推可确定。而用ORG指令则可以指定将指令或数据从某个地址开始存放。47三、END格式:END标号功能:标记汇编源程序结束。说明:放在源程序的最后一行,表示汇编程序到此结束。如果缺省,则会出问题。另外,在多模块程序设计中,只有主模块才需要加标号,而其他模块则不能加标号。标号是程序中第一条可执行指令的标号,常用BEGIN、START表示,可缺省。如缺省,则用过程名。48例2:用ORG改变数据段地址。DATA SEGMENT
ORG100HA1 DB10H,20H,30H ;A1偏移地址为100H
ORG200HA2 DW3031H,3233H ;A2的偏移地址200HDATA ENDS例1:用ORG指定代码段地址。CODESEGMENT
ORG100H ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX …CODE ENDS494.3.6其它伪指令语句一、宏指令在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化程序书写,该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,仍会产生源程序所需的代码。
宏指令的一般格式为:
宏指令名MACRO[形式参量表]宏体ENDM例如: SHIFTMACRO MOVCL,4 SALAL,Cl ENDM50二、MODEL指令在编写汇编语言程序中,有两中方式可以采用:一种采用完整的段定义方式;另一种则用模型的方式。格式:.MODEL模式选择符功能:指明简化段所使用的内存模式,指示数据与代码允许使用的长度。模式选择符:SMALL,MEDIUM,COMPACT,LARGE。SMALL:小模式,所有的数据在一物理段中,所有代码存放在另一物理段中。代码段与数据段均为近程,不与高级语言连接时一般为SMALL模式。515253;Z4L48.ASM.MODELSMALL.STACK100H.DATALIST1 DB100DUP(0BH)LIST2 DB100DUP(?).CODE.STARTUP CLD LEASI,LIST1 LEADI,LIST2 MOVCX,100例48:将从LIST1开始的100个字节的数传送到LIST2的单元。LP1: MOVAL,[SI] MOVDS:[DI],AL INCSI INCDI LOOPLP1.EXIT0 END544.4.1汇编语言程序设计概述1.编写源程序在弄清问题的要求,确定方案后,汇编语言程序设计者便可依据前面的指令系统和汇编语言的规定,逐个模块地编写汇编语言源程序。2.源程序输入微型机在编辑软件EDIT.EXE或其他编辑软件的支持下,将源程序输入到计算机中。通常,汇编语言源程序的扩展名为ASM。3.汇编利用汇编程序(或宏汇编程序)(ASM或MASM)对汇编语言源程序进行汇编,产生扩展名为OBJ的可重定位的目的代码。§4.4汇编语言程序设计554.连接利用连接程序(LINK)可将一个或多个扩展名为OBJ文件进行连接,生成扩展名为扩展名为EXE的可执行文件。5.调试对于稍大一些的程序来说,经过上述步骤所获得的.EXE可执行文件,在运行过程中难免无错。调试汇编程序最常用的工具是动态调试程序DEBUG。564.4.2程序设计的基本方法一、顺序结构程序设计例1:求两个数的平均值,这两个数分别在X单元和Y单元中,而平均值放在Z单元中。假定均为字节数,程序如下:;Z44L1.ASMDATASEGMENTXDB95YDB87ZDB?DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA57 PUSHDS XORAX,AX PUSHAX MOVAX,DATA MOVDS,AX MOVAL,X ADDAL,Y MOVAH,0 ADCAH,0 ;进位送AH MOVBL,2 DIVBL ;求平均值 MOVZ,AL RETMAIN ENDPCODE ENDS ENDMAIN58例2:内存中TABLE开始存放0~9的平方值,通过人机对话,当任意给定一个数X(0~9),查表得X的平方值,放在AL中。程序如下:;Z44L2.ASMDATA SEGMENTTABLE DB0,1,4,9,16,25,36,49,64,81BUF DB‘Pleaseinputonenumber’ DB‘(0~9):’,0DH,0AH,’$’DATA ENDS59CODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVDX,OFFSETBUF MOVAH,9 INT21H MOVAH,1 INT21H ;1号功能调用,键入数送AL ANDAL,0FH MOVBX,OFFSETTABLE MOVAH,0 ADDBX,AX MOVAL,[BX] ;查表得输入数的平方 MOVAH,4CH INT21HCODE ENDS ENDSTART60利用条件转移指令,使程序执行到某一指令后,根据条件是否满足,来改变程序执行的次序。在程序设计中经常会遇到各种判断和比较,例如“相等”和“不相等”;“正”和“负”;“大于”和“小于”;“满足条件”和“不满足条件”等等,这些判断和比较在程序中都可以组成各种不同的逻辑框,并产生相应的分支程序。二、分支结构程序设计611、简单分支结构6263例4.57:有8个加工子入口地址分别为P1、P2,…,P8。编程实现检测键盘输入命令,使系统分别转向8个程序,加工子程序。 MOVAH,1 INT21H ;DOS系统调用01,AL返回键值 CMPAL,‘1’ ;‘1’转移到P1 JEP1 CMPAL,‘2’ ;‘2’转移到P2 JEP2 … CMPAL,‘8’ ;‘8’转移到P8 JEP8 JMPSTP1:…方式1(逐一比较法):部分程序Z44L6F1.ASM2、多分支结构64方式2(用跳转表实现多分支):Z44L6F2.ASMBASE DWP1,P2,P3,P4 DWP5,P6,P7,P8KEY DB?
MOVAH,1 INT21H ANDAL,0FH MOVKEY,AL ;保留键值 MOVBX,OFFSETBASE MOVAH,0 ADDAL,AL ADDBX,AX ;求表地址 JMPWORDPTR[BX]P1低位P1高位P2低位P2高位P3低位P3高位P8低位P8高位BASEBASE+2BASE+3BASE+765例4.58:设有首地址为BUFFER的数组,已按升序排好,字组的长度为(=10),在该数组中查找数M(为80),若找到则从数组中删除,若找不到则将它插入到正确的位置。且变化后的数组长度在DX中。DATASEGMENT;Z44L7.ASMN DW10M DW80BUFFER DW5,10,21,32,47 DW65,77,85,90,105DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA05001000210032004700650077008500900010500+0+2+4+6+8+A+C+E+10+12+1466MAINPROCFARSTART: PUSHDS MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX MOVES,AX MOVAX,M;待查数送AX MOVCX,N;设置计数器 MOVDX,CX;初始化DX,保留个数 MOVDI,OFFSETBUFFER CLD REPNESCASW;用重复串扫描指令查找 JEDEL ;找到,转删除 DECDX ;个数减1,找存放位置 MOVSI,DX ADDSI,DX;地址指针指向最后一个数L1: CMPAX,BUFFER[SI];与[SI]的内容比较67 JLL2 MOVBUFFER[SI+2],AX;比SI所指单元内容大,存放 JMPL3L2: MOVBX,BUFFER[SI] MOVBUFFER[SI+2],BX ;数组下移一位 SUBSI,2;修改地址指针 JMPL1L3: ADDDX,2 ;因为DX前面减了1,故应加2 JMPNEXT1DEL: JCXZNEXT ;CX=0,表明最后一个是要找的数DEL1: MOVBX,[DI]MOV[DI-2],BXADDDI,2LOOPDEL1NEXT:DECDXNEXT1:RET ;程序结束,返回到DOSMAIN ENDPCODE ENDS ENDSTART68050010002100320047006500770080008500900010500+0+2+4+6+8+A+C+E+10+12+14+16M=80插入的位置N=1105001000210032004700650077008500900010500+0+2+4+6+8+A+C+E+10+12+14左边的数据如果再找M=80,大于80后面的数就会前移一个字,将80删除。69循环结构就是对同一种操作重复多次,这种程序有两种结构形式:(a)先执行,后判断进入循环后至少执行一次循环体,再判断循环结束条件。一般用于循环次数固定的程序。(b)先判断,后执行进入循环体后,先判断循环结束条件,再决定是否执行循环体。可能循环体一次也不执行。一般用于循环次数不确定的程序。三、循环结构程序设计701、用已知次数控制循环例:从BUF开始的10个连续单元中存放有10个无符号字节数,找出其中的最大者送入YY单元中。DATA SEGMENTXX DB71,32,43,64,195,06,87,19,108,08N=$-XX ;当前的地址-XX的地址为个数 YY DB? ;存放最大值DATAENDS71324364195687191088初始化时先取出71作为最大值存入AX与其它数比较,大者存入AX因此AX中是前面比较的最大值71CODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVAL,XX LEASI,XX MOVCX,N-1LOP1: INCSI CMPAL,[SI] JAELOP2 ;高于等于转移 MOVAL,[SI]LOP2: DECCX JNZLOP1 MOVYY,AL MOVAH,4CH INT21HCODE ENDS ENDSTART722、用条件控制循环由于无法确定循环次数,但可以用条件来确定循环是否结束。例:从自然数1开始计数,直到累加和大于1000为止,统计被累加的自然数的个数,并把统计的个数送入N单元,把累加和送入SUM单元。DATA SEGMENT N DB?SUM DW?DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATAMAIN PROCFAR73START: PUSHDS MOVAX,0 PUSHAX MOVAX,DATA MOVDS,AX MOVAX,0 MOVBX,AX MOVCX,AXLOP: INCBX ADDAX,BX INCCX CMPAX,1000 ;累加和小于1000? JBELOP ;不高于转移 MOVN,CX ;累加次数送N单元 MOVSUM,AX RETMAIN ENDPCODE ENDS ENDSTART74例:在以BUF为首址的字节存储单元区中存放有N个无符号数,试编程将它们从小到大排序。(冒泡法)排序方法:将第一个数与其后的N-1个数比较,如果后面的数小于第一个数,则将它们互换,否则继续比较。N-1次后,N个数中的最小数放在第一个存储单元中。余下的N-1个中,经过N-2次比较后,第二小者放在第二个单元中。…最后两个存储单元中的数比较1次后,从小到大的顺序就实现了。N个数,共比较(N-1)+(N-2)+…+2+1次。3、多重循环多重循环:循环体内再套循环。常见类型:数组访问,排序。75209010807040503060209010807040503060109020807040503060该数送AL与下一个比较小则交换76109020807040503060102090807040503060102030405060708090不在参加第2遍比较第1遍比较的结果第2遍比较的结果第8遍比较的结果不在参加第3遍比较77DATA SEGMENTBUF DB20H,90H,10H,80H,70H DB40H,50H,30H,60HN=$-BUF ;个数DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVDX,N-1 MOVSI,1LOP1: MOVDI,SI INCDI ;(SI)+1DI MOVAL,[BUF+SI-1]LOP2: CMPAL,[BUF+DI-1] JBENEXT;低于等于转移78 XCHG[BUF+DI-1],AL;高于交换 MOV[BUF+SI-1],ALNEXT: INCDI ;(DI)+1DI CMPDI,N JBELOP2 ;低于等于转移 INCSI ;(SI)+1SI CMPSI,N-1 JBELOP1 ;低于等于转移 MOVAH,4CH INT21HCODE ENDS ENDSTART79四、子程序结构程序设计子程序是具有一定的功能,能被多次调用的程序。1、子程序定义与调用①定义:过程名PROC[NEAR/FAR] 程序正文 RET 过程名ENDP②调用:CALL过程名80CODE SEGMENT ASSUMECS:CODEMAIN PROCFARSTART: PUSHDS MOVAX,0 PUSHAX
CALLOUTPUT
RETMAIN ENDPOUTPUT PROCNEAR MOVDL,‘M’ MOVAH,2 INT21H RETOUTPUT ENDPCODE ENDS ENDSTART例1:段内直接调用子程序,显示符“M”。81例2:段间调用,显示符“M”。CODE1 SEGMENT ASSUMECS:CODE1MAIN PROCFARSTART: PUSHDS MOVAX,0 PUSHAX
CALLFARPTROUTPUT RETMAIN ENDPCODE1 ENDS82CODE2 SEGMENT ASSUMECS:CODE2OUTPUT PROCFAR MOVDL,‘M’ MOVAH,2 INT21H RETOUTPUT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024幼儿园特色课程开发与教师聘用合同2篇
- 2025年度城市道路桥梁养护与维修合同范本3篇
- 2024年餐馆承包经营协议6篇
- 2024年车联网技术研究与应用合同
- 2025年度化学品船运输安全责任协议书模板3篇
- 2024版文化创意产业项目投资与合作协议
- (完整版)信号与系统(吴大正)-完整版答案-纠错修改后版本
- 世界现代设计史简述
- 克雷洛夫寓言中的狐狸和乌鸦好词好句读后感
- 浙江理工大学《城市经济学》2023-2024学年第一学期期末试卷
- 医保统计信息管理制度
- 山东师范大学《计算机网络》期末考试复习题及参考答案
- 大学暑假假期社会实践心得体会3篇
- 2024湖南湘电集团有限公司招聘笔试参考题库附带答案详解
- 运筹学讲义-运筹学完整讲义
- 5.40.49火灾自动报警系统火灾显示盘调试、检测质量标准和检验方法(完)
- 代理商工作总结
- 战略管理徐飞版
- 2023浙江省杭州市中考语文真题试卷和答案
- 银行防诈骗知识宣传
- 【实战篇】华为IPD流程的应用案例
评论
0/150
提交评论