《汇编语言程序设计》第5章 基本汇编语言程序设计_第1页
《汇编语言程序设计》第5章 基本汇编语言程序设计_第2页
《汇编语言程序设计》第5章 基本汇编语言程序设计_第3页
《汇编语言程序设计》第5章 基本汇编语言程序设计_第4页
《汇编语言程序设计》第5章 基本汇编语言程序设计_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章基本汇编语言程序设计第5章基本汇编语言程序设计5.1汇编语言程序的设计步骤5.2顺序结构的程序设计5.3分支结构的程序设计5.4循环结构的程序设计5.5子程序设计第5章基本汇编语言程序设计5.1汇编语言程序的设计步骤5.2顺序结构的程序设计5.3分支结构的程序设计5.4循环结构的程序设计5.5子程序设计5.1汇编语言程序的设计步骤汇编语言程序设计的基本步骤程序的基本结构5.1汇编语言程序的设计步骤一个良好的程序应该满足以下要求:(1)程序要结构化,简明、可读性好,便于调试。(2)执行速度快,程序代码效率高。(3)占用存储空间少。汇编语言程序设计的基本步骤5.1汇编语言程序的设计步骤汇编语言程序设计的基本步骤:1.分析题意,确定数据结构和算法2.根据算法绘制程序流程图3.根据流程图编写程序4.调试程序汇编语言程序设计的基本步骤5.1汇编语言程序的设计步骤例5.1在100个字的无符号整数字中找出最大数。汇编语言程序设计的基本步骤5.1汇编语言程序的设计步骤1.分析题意,确定数据结构和算法(1)初始化,建立一个数据指针指向数据区的首地址;(2)将第一个数存入寄存器(如AX)中;(3)调整数据指针,使其指向下一个数;(4)将数据指针所指的数与寄存器AX的内容相比较,如果该数较大,则将其存入AX,否则丢掉;(5)重复执行(3)、(4)两步,直至将数组中的数据全部处理完。汇编语言程序设计的基本步骤5.1汇编语言程序的设计步骤2.根据算法绘制程序流程图汇编语言程序设计的基本步骤5.1汇编语言程序的设计步骤3.根据流程图编写程序DATASEGMENTARRAYDW100DUP(?)DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX LEASI,ARRAY;将ARRAY的首地址送入数据指针SI MOVCX,99;设置循环次数

MOVAX,[SI];将第一个数存入AXNEXT: ADDSI,2;修改数据指针指向下一个数据

CMPAX,[SI];两数比较

JAELOOP1;AX≥[SI],转LOOP1 MOVAX,[SI];否则,将较大数存入AX LOOP1:DECCX JNZNEXT MOVAH,4CH INT21HCODEENDS ENDSTART汇编语言程序设计的基本步骤5.1汇编语言程序的设计步骤4.调试程序两个阶段:静态检查上机运行调试程序的基本结构5.1汇编语言程序的设计步骤1.顺序结构2.分支结构3.循环结构程序的基本结构5.1汇编语言程序的设计步骤1.顺序结构程序的基本结构5.1汇编语言程序的设计步骤2.分支结构程序的基本结构5.1汇编语言程序的设计步骤3.循环结构第5章基本汇编语言程序设计5.1汇编语言程序的设计步骤5.2顺序结构的程序设计5.3分支结构的程序设计5.4循环结构的程序设计5.5子程序设计5.2顺序结构的程序设计例5.2将一字数据从数据段的某个单元传送到另一个单元。分析:因为8086.8088指令系统不允许在存储器与存储器之间直接传送数据,所以必须借助CPU内部的通用寄存器AX、BX、CX、DX等,先将存储单元中的字数据传送到寄存器,再将其由寄存器传送到存储器的另一个字单元。5.2顺序结构的程序设计DATASEGMENTFIRSTDW1234HSECONDDW?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAX,FIRST MOVSECOND,AX MOVAH,4CH INT21HCODEENDS ENDSTART5.2顺序结构的程序设计例5.3将键盘输入的小写字母用大写字母显示出来。分析:本题目涉及三个知识点:(1)输入:在8086.8088指令系统中,字符的输入是由DOS21H中断的01H子功能来实现的,命令序列如下: MOVAH,01H INT21H

其作用是从键盘接收一个字符并将该字符的ASCII码存入寄存器AL中。5.2顺序结构的程序设计(2)输出:在8086.8088指令系统中,字符的输出是由DOS21H中断的02H子功能来实现的,命令序列如下: MOVAH,02H INT21H

其作用是将寄存器DL中所存放的字符进行显示输出,故在执行该命令序列之前,应先将被输出字符的ASCII码存入DL中。(3)小写字母向大写字母的转换:将小写字母的ASCII码值减去20H即可得到对应大写字母的ASCII码值。5.2顺序结构的程序设计CODESEGMENT ASSUMECS:CODESTART:MOVAH,01H INT21H SUBAL,20H MOVDL,AL MOVAH,02H INT21H MOVAH,4CH INT21HCODEENDS ENDSTART第5章基本汇编语言程序设计5.1汇编语言程序的设计步骤5.2顺序结构的程序设计5.3分支结构的程序设计5.4循环结构的程序设计5.5子程序设计5.3分支结构的程序设计双分支结构的程序设计多分支程序设计双分支结构的程序设计5.3分支结构的程序设计框架结构:

先行指令

JXX标号1

指令序列1 JMP标号2;转到出口标号1:指令序列2标号2:…功能:JXX条件成立时转到标号1处执行指令序列2,否则执行指令序列1,然后跳转到标号2的程序出口处。双分支结构的程序设计5.3分支结构的程序设计例5.4比较两个带符号数的大小,把大数存入MAX单元。分析:比较两数可用CMP指令,而带符号数的比较结果可由标志位SF、OF来确定,选用的转移指令应为JG、JL等。DATASEGMENTADW34BDW65MAXDW?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAX,A MOVBX,B CMPAX,BX JLNEXT MOVMAX,AX JMPEXITNEXT:MOVMAX,BXEXIT:MOVAH,4CH INT21HCODEENDS ENDSTART5.3分支结构的程序设计双分支结构的程序设计5.3分支结构的程序设计例5.5比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示′MATCH′,若不相同则显示′NOMATCH′。分析:比较两个字符串可用指令REPECMPSB,比较后如果ZF=1,则两个字符串完全相同,如果ZF=0,则两个字符串不完全相同。字符串的输出是由DOS21H中断的09H子功能来实现的,该子功能要求将被输出的字符串存入数据段中,存储时以′$′结束,输出时将其首地址存入DX寄存器。DATASEGMENTSTRING1DB′ABCDEFG′OUT1DB′MATCH$′OUT2DB′NOMATCH$′DATAENDSEXTRASEGMENTSTRING2DB′ABCDEFG′EXTRAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA,ES:EXTRASTART:MOVAX,DATA MOVDS,AX MOVAX,EXTRA MOVES,AX MOVCX,7;字符串长度存入CX LEASI,STRING1;STRING1的首地址存入SI LEADI,ES:STRING2;STRING2的首地址存入DI CLD;置方向标志DF=0 REPECMPSB;相同时重复比较

JNZOUTPUT2;不匹配,转OUTPUT2 LEADX,OUT1;OUT1首地址存入DX MOVAH,09H;输出OUT1 INT21H JMPEXIT;转EXIT,结束OUTPUT2:LEADX,OUT2;OUT2首地址存入DX MOVAH,09H;输出OUT2 INT21HEXIT:MOVAH,4CH INT21HCODEENDS ENDSTART5.3分支结构的程序设计多分支序设计5.3分支结构的程序设计例5.6比较两个无符号整数A和B,若A>B则输出“>”,若A<B则输出“<”,若A=B则输出“=”。分析:根据题意,本题应有三个分支:A>B、A<B和A=B,按照逻辑分解的方法,我们可先将其归并为两个条件:A≥B和A<B,由此形成两个分支,再将分支A≥B进一步分解为A>B和A=B,各分支均可用条件转移指令来实现。DATASEGMENTADW34BDW56DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAX,A MOVBX,B CMPAX,BX JAENEXT1 MOVDL,′<′ JMPEXITNEXT1:JANEXT2 MOVDL,′=′ JMPEXITNEXT2:MOVDL,′>′EXIT:MOVAH,02H INT21H MOVAH,4CH INT21HCODEENDS ENDSTART5.3分支结构的程序设计多分支序设计5.3分支结构的程序设计例5.7已知两个整数字节变量A和B,试编写完成下列操作的程序:

(1)若两个数中只有一个是奇数,则将奇数存入ABUF单元,偶数存入BBUF单元中。(2)若两个数均为奇数,则两数分别加1,并存回原变量处。(3)若两个数均为偶数,则两变量不变。分析:在计算机中,数据的奇偶性取决于最低位的值,0为偶数,1为奇数。因此可采用位测试的办法来判断。首先判断A与B是否同种类型的数,不是同种类型,再判断B是否为偶数,由B的类型可确定A的类型,再按要求(1)进行处理;同样,当A、B是同种类型时,也判断B是否为偶数,再按要求(2)或(3)进行处理。判断A、B两数是否同类,可使用XOR指令将两数异或,若结果的最低位为0,则两数同类。多分支程序设计5.3分支结构的程序设计5.3分支结构的程序设计DATASEGMENTABUFDBABBUFDBBDATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVAL,ABUF MOVBL,BBUF XORAL,BL TESTAL,01H;测试是否同类 JZCLASS;是同类,转CLASS TESTBL,01H;不是同类,测试B是否偶数 JZEXIT;B是偶数,满足要求(1),转EXIT XCHGBL,ABUF;B不是偶数,按要求(1),交换两数 MOVBBUF,BL JMPEXIT;转EXITCLASS:TESTBL,01H;同类时,测试B是否偶数 JZEXIT;B是偶数,满足要求(3),转EXIT INCABUF;B不是偶数,按要求(2),两数同时加1 INCBBUFEXIT:MOVAH,4CH INT21HCODEENDS ENDSTART第5章基本汇编语言程序设计5.1汇编语言程序的设计步骤5.2顺序结构的程序设计5.3分支结构的程序设计5.4循环结构的程序设计5.5子程序设计5.4循环结构的程序设计循环程序的结构循环结构的程序设计方法循环程序的结构5.4循环结构的程序设计循环程序都可由如下三部分组成:1.设置循环的初始状态2.循环体3.循环控制部分循环程序的结构5.4循环结构的程序设计1.设置循环的初始状态 循环程序的初始状态,应该在进入循环体之前设置,其目的是保证循环体能够正常运行和结束,具体内容包括设置循环次数的计数值或其他能使循环结束的条件的初值,以及为循环体正常工作而建立的初始状态等。循环程序的结构5.4循环结构的程序设计2.循环体 循环体是整个循环程序中需要重复执行的程序段,即循环工作的主体。它由循环的工作部分和修改部分组成。循环的工作部分是为完成程序功能而设计的主要程序段,循环的修改部分则是为保证循环体在执行有限次后能够正常结束而设置的程序段,一般是对循环控制参数进行修改,而该参数的变化通常是有规律的。循环程序的结构5.4循环结构的程序设计3.循环控制部分 每个循环程序必须选择一个循环控制条件来控制循环的运行和结束,而合理地选择这个控制条件就成为循环程序设计的关键问题。循环程序的结构5.4循环结构的程序设计(1)循环次数已知,用循环次数作为循环的控制条件

MOVCX,N标号: … … … LOOP标号循环程序的结构5.4循环结构的程序设计(2)循环次数已知,但也有可能使用其他特征或条件来使循环提前结束

MOVCX,N标号: … … … LOOPZ.LOOPNZ标号循环程序的结构5.4循环结构的程序设计(3)循环次数是未知的,这时就要根据具体情况找出控制循环结束的条件直到型循环:标号: … … …

影响条件标志位的指令

JXX标号循环程序的结构5.4循环结构的程序设计当型循环:标号2: …

影响条件标志位的指令

JXX标号1 … … … JMP标号2

标号1:…循环程序的结构5.4循环结构的程序设计设计循环程序的步骤:

(1)分析问题,确定循环次数是已知的还是未知的,是否有提前结束循环的情况,从而决定选用哪一种循环最恰当;

(2)根据循环变化的规律,确定适合于循环设计的工作部分;

(3)考虑循环参数的修改部分,分析并确定参数的每次修改方法;

(4)设置循环控制部分及循环参数的置初值部分,可根据循环程序控制方法的不同,来设置循环参数的初值。循环结构的程序设计方法5.4循环结构的程序设计两种基本模式:单循环结构多重循环结构循环结构的程序设计方法5.4循环结构的程序设计1.单循环结构2.多重循环结构循环结构的程序设计方法-单循环结构5.4循环结构的程序设计例5.8编程计算10个整数之和(不考虑溢出),并将结果存入SUM中。分析:这10个整数可存放在数组ARRAY中,从而将题目转化为对数组元素求和,根据数组元素下标的变化规律来设计循环,本题中循环次数固定为10次,因此可使用LOOP指令。5.4循环结构的程序设计DATASEGMENTARRAYDW3,5,6,7,2,4,1,6,8,9SUMDW?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVSI,0 ;设置数组中第一个元素的偏移量

MOVCX,10;设置循环次数

MOVAX,0;累加器清0NEXT:ADDAX,ARRAY[SI];累加

ADDSI,2;计算下一元素偏移量

LOOPNEXT;CX-1≠0时继续循环

MOVSUM,AX;累加和存入SUM MOVAH,4CH INT21HCODEENDS ENDSTART循环结构的程序设计方法-单循环结构5.4循环结构的程序设计例5.9在ADDR单元中存放着数Y的地址,试编制一程序把Y中1的个数存入COUNT单元中。分析:要测出Y中1的个数就应逐位测试,一个比较简单的办法是用移位的方法把各位依次移到最高位,然后根据最高有效位是否为1来计数。循环的结束可以用计数值16来控制,但考虑到数Y的末几位全为0(如1011010000000000B)的特殊情况,循环应能提前结束,且可能为零次循环,为了提高程序的执行效率,应采用当型结构,以测试数是否为0来作为结束条件。5.4循环结构的程序设计DATASEGMENTADDRDWYYDW0102HCOUNTDW?DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA MOVDS,AX MOVCX,0;计数器清0 MOVBX,ADDR;取Y的地址

MOVAX,[BX];将Y存入AXREPEAT:TESTAX,0FFFFH;测试Y JZEXIT;如果Y=0,转EXIT结束

JNSSHIFT;如果SF=0,转SHIFT INCCX;SF=1,计数器加1SHIFT:SHLAX,1;Y逻辑左移1位

JMPREPEAT;继续循环EXIT:MOVCOUNT,CX;1的个数存入COUNT MOVAH,4CH INT21HCODEENDS ENDSTART循环结构的程序设计方法-单循环结构5.4循环结构的程序设计例5.10有一串20个字符的字符串存储于首地址为STRING的存储区中,要求在字符串中查找空格(ASCII码为20H),如果找到则输出“FOUNDSPACE”,否则输出“NOTFOUNDSPACE”。分析:本题可以使用查找字符串的指令REPNZSCASB来实现,也可以用循环指令来实现。在此,我们采用循环指令的方法用CMP指令逐个字符进行查找。根据题意,有两种可能性:

(1)在查找中找到了空格符,此时ZF=1,应该提前结束循环;

(2)如一直查找到字符串结束还未找到空格符,则由于循环计数器CX变为0而结束循环。据此,本题应考虑使用LOOPE或LOOPNE指令。5.4循环结构的程序设计DATASEGMENTSTRINGDB″MYPERSONALCOMPUTER″OUT1DB″FOUNDSPACE$″OUT2DB″NOTFOUNDSPACE$″DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVCX,20;字符串长度存入CX MOVSI,-1 MOVAL,20H;空格符存入ALNEXT: INCSI;修改地址

CMPAL,STRING[SI];比较字符

LOOPNENEXT;不相等时重复

JNZNOTFOUND;ZF=0转到NOT_FOUND MOVDX,OFFSETOUT1;否则,输出OUT1字符串

MOVAH,09H INT21H JMPEXITNOTFOUND: MOVDX,OFFSETOUT2;输出OUT2字符串

MOVAH,09H INT21HEXIT: MOVAH,4CH INT21HCODEENDS ENDSTART循环结构的程序设计方法-单循环结构5.4循环结构的程序设计例5.11将正数N插入一个已排序的字数组的正确位置。该数组的首地址和末地址分别为ARRAYHEAD和AYYAYEND,其中所有数均为正数且已按递增的次序排列。分析:由于数组的首地址和末地址都是已知的,因此数组长度可以确定。但是这里只要求插入一个数,并不一定要扫描整个数组,所以可以用找到应插入数的位置作为循环的结束条件。此外,为空出要插入数的位置,其后的全部元素都应后移一个字(即向地址增大的方向移动一个字),所以算法上应该从数组的尾部向头部查找,可逐字取出数组中的一个数K与N作比较,如K>N,则把K后移一个字,然后继续向前查找;如果K≤N,则把N插入在K之后就可以结束程序了。5.4循环结构的程序设计DATASEGMENTARRAYHEADDW3,5,14,23,36,45,56,67,78,99ARRAYENDDW101NDW32DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATASTART: MOVAX,DATA MOVDS,AX MOVAX,N;N送入AX MOVARRAYHEAD-2,-1;数组前一字单元置-1 MOVSI,0LOCATE: CMPARRAYEND[SI],AX;K与N比较

JLEINSERT;K≤N,转INSERT,插入N MOVBX,ARRAYEND[SI]

MOVARRAYEND[SI+2],BX ;K>N,K后移一个字

SUBSI,2;准备取前一个元素

JMPLOCATE;继续查找INSERT: MOVARRAYEND[SI+2],AX;N插在K之后

MOVAH,4CH INT21HCODEENDS ENDSTART循环结构的程序设计方法-单循环结构5.4循环结构的程序设计例5.12设有数组X和Y。X数组中有X1,X2,…,X10;Y数组中有Y1,Y2,…,Y10。试编制程序计算: Z1=X1+Y1 Z2=X2+Y2 Z3=X3-Y3 Z4=X4-Y4 Z5=X5-Y5 Z6=X6+Y6 Z7=X7-Y7 Z8=X8-Y8 Z9=X9+Y9 Z10=X10+Y10结果存入Z数组。循环结构的程序设计方法-单循环结构5.4循环结构的程序设计分析:对于这种问题,我们也可用循环程序结构来完成。已知循环计数值为10,每次循环的操作数是可以顺序取出的,但所做的操作却有不同,这里有两种操作:加法和减法。为了区别每次应该做哪一种操作,可以设立标志位,如标志位为0做加法,为1做减法,这样进入循环后只要判别标志位就可确定应该做的操作了。5.4循环结构的程序设计DATASEGMENTXDW1,2,9,8,7,3,6,5,4,1YDW2,1,2,3,4,2,3,2,1,5ZDW10DUP(?)LOGICRULEDW00DCH;逻辑尺DATAENDSCODESEGMENT ASSUMECS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX MOVCX,10;设置循环次数

MOVBX,0 MOVDX,LOGICRULEL: MOVAX,X[BX]

SHRDX,1;逻辑尺右移1位

JCSUBB;CF=1,转SUBB ADDAX,Y[BX]

JMPRESULTSUBB: SUBAX,Y[BX]

RESULT:MOVZ[BX],AX;结果存入Z ADDBX,2 LOOPL MOVAH,4CH INT21HCODEENDS ENDSTART循环结构的程序设计方法-多重循环结构5.4循环结构的程序设计多重循环指的是循环的嵌套,即循环体部分又包含了另一个循环。多重循环程序设计的基本方法和单循环的设计方法是一致的,应分别考虑各层循环的控制条件及其程序实现,相互之间不能混淆。另外应该注意在每次通过外层循环再次进入内层循环时,内层循环的初始条件必须重新设置。特别要注意的是,如果内、外层循环都使用CX做循环计数器,在进入内层循环之前一定要先把外层循环的循环计数器的值保存下来,才能设置内层循环的次数。循环结构的程序设计方法-多重循环结构5.4循环结构的程序设计常见的双重循环的程序结构:

外层循环初始化

MOVCX,外层循环次数MLOOP1: … ;外层循环体的指令

MOVDI,CX ;保存外层循环次数内层循环初始化

MOVCX,内层循环次数N ;设置内层循环次数LOOP2: … ;内层循环的循环体

LOOPLOOP2 ;继续内层循环

MOVCX,DI ;恢复外层循环的次数

… ;外层循环体的指令序列

LOOPLOOP1 ;继续外层循环第5章基本汇编语言程序设计5.1汇编语言程序的设计步骤5.2顺序结构的程序设计5.3分支结构的程序设计5.4循环结构的程序设计5.5子程序设计5.5子程序设计子程序的定义子程序的设计要求子程序的参数传递及应用举例子程序的定义5.5子程序设计

过程名PROC属性

过程名ENDP 过程名为标识符,其写法与标号的写法相同,它代表子程序入口的符号地址;属性是指子程序的类型属性,它可以是NEAR或FAR。

属性的确定原则如下:

如果子程序只允许被与它在同一代码段中的程序调用,则属性应设置为NEAR,否则,应设置为FAR。子程序的定义5.5子程序设计例5.13调用程序和子程序在同一代码段中。

CODESEGMENT

;主程序

MAINPROCFAR …CALLSUB1 … RET MAINENDP

;子程序

SUB1PROCNEAR … RET SUB1ENDP CODEENDS由于调用程序MAIN和子程序SUB1在同一代码段中,所以SUB1定义为NEAR属性,这样MAIN中对SUB1的调用和SUB1中的RET就都是NEAR属性的。但是一般说来,主过程MAIN应定义为FAR属性,这是由于我们把程序的主过程看做是DOS调用的一个子程序,因而DOS对MAIN的调用以及MAIN中的RET就是FAR属性的。子程序的定义5.5子程序设计例5.14调用程序和子程序不在同一个代码段内。

;代码段1 CODE1SEGMENT … ;子程序

SUBTPROCFAR … RET SUBTENDP … CALLSUBT ;段内调用

CODE1ENDS ;代码段1结束

;代码段2 CODE2SEGMENT … CALLSUBT ;段间调用

… CODE2ENDS ;代码段

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论