欢迎分享,转载请注明来源:内存溢出
微型机原理与程序设计微型机原理与程序设计程序举例顺序结构例例2-3-2 计算计算x(yz)vx的值。的值。设x,y,z,v为十六位有符号数,分别存放在X,Y,Z,V字单元,商和余数分别存入A,B字单元。DSEGSEGMENT定义数据段XDW4FHYDW245HZDW3456HVDW5678HADW?BDW?DSEGENDS微型机原理与程序设计微型机原理与程序设计CSEGSEGMENT定义代码段ASSUMECS:CSEG,DS:DSEG0000B8CA0BSTART:MOVAX, DSEG00038ED8MOVDS, AX0005A10200MOVAX, Y000803060400ADDAX, Z计算y+zF72E0600IMULV计算*v00108BC8MOVCX, AX00128BDAMOVBX, DX结果暂存0014A10000MOVAX, X001799CWD字变双字00182BC1SUBAX, CX计算加法1BD3SBBDX, BXF73E0000IDIVX计算除法0020A30000MOVA, AX保存商002300MOVB, DX保存余数0027BMOVAX, 00H程序结束CD21INT21HCSEGENDSENDSTART程序举例顺序结构微型机原理与程序设计微型机原理与程序设计程序举例分支结构单分支结构-在某种确定的条件下只执行两个分支中的一个分支,而另一个分支将不被执行多分支结构-针对不同条件引出多种处理分支微型机原理与程序设计微型机原理与程序设计程序举例分支结构例例2-3-3 若数据段定义的字节变量若数据段定义的字节变量X是正数,则计算它的相反数,并且赋值给是正数,则计算它的相反数,并且赋值给X变量变量;否则不变。;否则不变。SKSGSEGMENTSTACKSTACK定义堆栈段STKDW32 DUP (?)SKSGENDSDASGSEGMENT定义数据段XDB93HDASGENDSCOSGSEGMENT定义代码段ASSUMECS:COSG,DS:DASG,SS:SKSG0000B8CE0BBEGIN:MOVAX,DASG00038ED8MOVDS, AX0005B8CA0BMOVAX,SKSG00088ED0MOVSS, AXBC4000MOVSP, SIZE STK微型机原理与程序设计微型机原理与程序设计程序举例分支结构000DA00000MOVAL, X取数据到AX寄存器001000CMPAL,0判断数据正负00127E05JLEEXIT0014F6D8NEG若CV为正,则取反0016A20000MOVX, AL0019BEXIT:MOVAX,00HCD21INT21HCOSGENDSENDBEGIN微型机原理与程序设计微型机原理与程序设计程序举例分支结构例例2-3-4 编写完整程序,比较两个字符串编写完整程序,比较两个字符串STR1与与STR2所含字符是否完全相同,所含字符是否完全相同,若相同则显示若相同则显示“MATCH”,若不相同则显示,若不相同则显示“NO MATCH”。微型机原理与程序设计微型机原理与程序设计程序举例分支结构SKSGSEGMENTSTACKSTACK设置堆栈段STKDW32 DUP(0)SKSGENDSDASGSEGMENT设置数据段CREQU13LFEQU10STROUTDBTHE RESULT IS:,$STRMDBMATCH,CR,LF,$ STRNMDBNO MATCH,CR,LF,$STR1DBLEN1DB$-STR1STR2DBCHEERLEN2DB$-STR2DASGENDSCOSGSEGMENT设置代码段ASSUMESS:SKSG,DS:DASG, ES:DASG, CS:COSG0000B8CE0B:MOVAX, DASG00038ED8MOVDS, AX0005B8CA0BMOVAX, SKSG00088ED0MOVSS, AXBC4000MOVSP, SIZE STK000D8EC0MOVES, AX微型机原理与程序设计微型机原理与程序设计8D160000LEADX, STROUT取原数据首址0013B409MOVAH, 9显示字符串0015CD21INT21H00170E2700MOVCL, LEN1取数据串数据001B0E2D00CMPCL, LEN27519JNZOUTNM0021FCCLD00228D362200LEASI, STR1取字符串1首址00268D3E2800LEADI, STR2取字符串2首址32EDXORCH, CHF6REPECMPSB数据串比较002EJNZOUTNM00308D00LEADX, STRM0034B409MOVAH, 90036CD21INT21H0038EB08JMPEXIT8D161700OUTNM:LEADX, STRNM003EB409MOVAH, 90040CD21INT 21H0042BEXIT:MOVAX, 00H0045CD21INT21HCOSGENDSENDMAIN程序举例分支结构微型机原理与程序设计微型机原理与程序设计程序举例循环结构例例2-3-5 接收从键盘输入的字符,判别该字符是否为字母、数字或非字母也非数字类接收从键盘输入的字符,判别该字符是否为字母、数字或非字母也非数字类字符。若为字母,屏幕输出字符。若为字母,屏幕输出LETTER;若为数字,屏幕输出;若为数字,屏幕输出NUM;若非字母也非数字;若非字母也非数字类字符,则输出类字符,则输出OTHERS。微型机原理与程序设计微型机原理与程序设计程序举例顺序结构SKSGSEGMENTSTACKSTACK设置堆栈段STKDW32 DUP(0)SKSGENDSDASGSEGMENT设置数据段CREQU13LFEQU10CHARINDBPLEASE INPUT ACHAROUTDBTHE RESULT IS:LOUTDBLETTER,$NOUTDBNUM,$OOUT DBOTHERS,$CRLFDBCR,LF,$DASGENDSCOSGSEGMENT设置代码段ASSUMESS:SKSG,DS:DASG:MOVAX, DASGMOVDS, AXMOVAX, SKSGMOVSS, AXMOVSP, SIZE DW STK设置堆栈指针微型机原理与程序设计微型机原理与程序设计程序举例顺序结构LEADX, CHARIN取原数据首址MOVAH, 9显示数据串INT21HMOVAH, 1键盘输入INT21HLEADX, CRLF取数据串首址MOVAH, 9INT21H LEADX, CHAROUT取输出串首址MOVAH, 9INT21HCMP, 0判断是否为数字JBOTHERSCMP, 9JACON1LEADX, NOUTMOV AH, 9INT21HJMPEXITCON1:CMP, A判断是否为字母JBOTHERS微型机原理与程序设计微型机原理与程序设计CMPAL, ZJACON2LEADX, LOUTMOVAH, 9INT21HJMPEXITCON2:CMP, AJBOTHERSCMPAL, ZJAOTHERSLEADX, LOUTMOVAH, 9INT21HJMPEXITOTHERS:LEADX, OOUTMOVAH, 9INT21HEXIT:MOVAX,00HINT21HCOSGENDSEND程序举例顺序结构微型机原理与程序设计微型机原理与程序设计程序举例循环结构例例2-3-6 设内存设内存DATA1和和DATA2开始分别存放开始分别存放50个无符号字数据,编制程序将两个个无符号字数据,编制程序将两个存储区对应字数据求和并存放在存储区对应字数据求和并存放在SUM开始的单元。开始的单元。设置源 *** 作数、目的 *** 作数和存放结果指针从源指针指出的字单元取出数据目的指针指出的字单元的数据相加和存入结果的字单元修改各地址指针,使之指向下一个字数据求和,保存结果修改各地址指针,使之指向下一个字数据求和,保存结果:微型机原理与程序设计微型机原理与程序设计程序举例循环结构微型机原理与程序设计微型机原理与程序设计程序举例循环结构(1)先执行后判断结构先执行后判断结构(即直到型结构)此结构的特点是,进入循环后,先执行循环体,再判断循环控制条件。若满足循环结束条件,则退出循环;否则,继续执行循环体。循环体至少执行一次。(2)先判断后执行结构先判断后执行结构(即当型结构)此结构的特点是,进入循环后,先判断循环控制条件,若满足循环结束条件,则退出循环;否则继续执行循环体。依据控制条件可能一次也不执行循环体。微型机原理与程序设计微型机原理与程序设计例例2-3-7 编程求编程求1+2+3+的前的前N项和,直到其和刚刚大于项和,直到其和刚刚大于1000。将。将N值保存在值保存在DX中,累加和保存在中,累加和保存在AX中。中。程序举例循环结构微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK设置堆栈段STKDW32 DUP(?)SKSGENDSCOSGSEGMENT设置代码段ASSUMECS:COSG,SS:SKSG0000B8CA0BMAIN:MOVAX, SKSG00038ED0MOVSS, AX0005BC4000MOVSP, SIZE STK00080XORAX, AXBA0100MOVDX, 1000D2NEXT:ADDAX, DX计算加法42INCDX00103DE803CMPAX, 1000判断和是否大于100000138JNANEXT0015DECDX0016BMOVAX, 00H0019CD21INT21HCOSGENDSENDMAIN程序举例循环结构微型机原理与程序设计微型机原理与程序设计程序举例循环结构将上例使用当型结构来编程将上例使用当型结构来编程微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK设置堆栈段STKDW32 DUP(?)SKSGENDSCOSGSEGMENT设置代码段ASSUMECS:COSG,SS:SKSG00000MAIN:XORAX, AX0002BA0100MOVDX, 100053DE803CON:CMPAX, 1000判断和是否大于100000087705JANEXT2ADDAX, DX计算加法和42INCDX000DEBF6JMPCONNEXT:DECDX0010BMOVAX, 00H0013CD21INT21HCOSGENDSEND MAIN程序举例循环结构微型机原理与程序设计微型机原理与程序设计程序举例顺序结构常用的循环控制方法循环控制方法有计数控制计数控制、条件控制条件控制、逻辑尺控制逻辑尺控制和开关控制法开关控制法等计数控制计数控制的循环程序设计的特点是循环次数已知,利用某个寄存器或存储单元作为计数器,由计数器的值控制循环结束。计数的方法有两种:增量计数和减量计数。计数器置初值后,每循环一次,计数器的值按步长值进行加/减,直到某一值时,循环结束。例例2-3-9 编程求带符号字节数组编程求带符号字节数组ARR中的最大值中的最大值,此值存放在,此值存放在DL中。中。微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK设置堆栈段STKDW32 DUP(?)SKSGENDSDASGSEGMENT设置数据段ARRDB34H,12H,0AH,2H,00H,6DH,9AHLENDB$-ARRDASGENDSEXSGSEGMENTEXSGENDSCOSGSEGMENT设置代码段ASSUMECS:COSG,DS:DASG,SS:SKSG0000B8CE0BMAIN:MOVAX, DASG00038ED8MOVDS,AX0005B8CA0BMOVAX,SKSG00088ED0MOVSS, AXBC4000MOVSP, SIZE STK000DB280MOVDL,-128设置DL寄存器32EDXORCH, CH00110E0700MOVCL,LEN0015FCCLD00168D360000LEASI,ARRACSKIP:LODSB取数据到AX001B38D0CMP,DL数据比较001D7602JNANEXT8AD0MOVDL, 0021E7NEXT:SKIP0023BMOVAX,00H0026CD21INT21HCOSGENDSENDMAIN程序举例顺序结构微型机原理与程序设计微型机原理与程序设计程序举例顺序结构条件控制当循环次数未知时,可采用条件控制的方法,编写条件控制循环程序。在程序设计中,应先确定循环控制条件,每循环一次,都要对条件进行检查。若满足循环结束条件,则循环结束,否则继续循环,直到满足条件为止。例例2-3-10 编程统计编程统计AX寄存器中的二进制位寄存器中的二进制位1的个数。的个数。微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK设置堆栈段STKDW 32 DUP(0)SKSGENDSDASGSEGMENT设置数据段YDW88ABHDASGENDSCOSGSEGMENT设置代码段ASSUMESS:SKSG,DS:DASG,CS:COSG0000B50BMAIN:MOVAX,DASG00038ED8MOVDS,AX0005B10BMOVAX,SKSG00088ED0MOVSS, AXBC4000MOVSP, SIZE STK000DB100MOVCL,0CL寄存器赋初值A10000MOVAX,Y0012A9FFFFL0:TESTAX,0FFFFH判断数据是否为负数00157408JZEXIT00177902JNSNEXT0019FEC1INCCL001BD1E0NEXT:SALAX,1001DEBF3JMPL0BEXIT:MOVAX,00H0022CD21INT21HCOSGENDSENDMAIN程序举例顺序结构微型机原理与程序设计微型机原理与程序设计程序举例循环结构逻辑尺控制例例2-3-11 设有字节数组设有字节数组X和和Y。X和和Y数组各有数组各有10个元素。试编程计算个元素。试编程计算微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK设置堆栈段STKDW32 DUP(0)SKSGENDSDASGSEGMENT设置数据段X_ARRDW1BH,22H,13H,14H,5H,36H,27H,18H,90H,10HY_ARRDW10H,32H,13H,41H,15H,26H,7FH,28H,29H,10H RESULTDW10 DUP(?)LOGIC_LD W24EHDASGENDSCOSGSEGMENT设置代码段ASSUMESS:SKSG,DS:DASG,CS:COSG0000B50BMAIN:MOVAX,DASG00038ED8MOVDS,AX0005B10BMOVAX,SKSG00088ED0MOVSS,AXBC4000MOVSP, SIZE STK000DBB0000MOVBX,00010B00MOVCX,10设置循环次数00138B00MOVDX,LOGIC_L00178B870000NEXT:MOVAX,X_ARRBX001BD1EASHRDX,1判断标志位的值001D7206JCSUBSTRACT03871400ADDAX,Y_ARRBX计算加法算式0023EB04JMPRES00252B871400SUBSTRACT: SUBAX,Y_ARRBX计算减法算式002989872800RES:MOVRESULTBX,AX结果存放002D302ADDBX,2设置数据指针0030E2E5NEXT0032BMOVAX,00H0035CD21INT21HCOSGENDSENDMAIN程序举例循环结构微型机原理与程序设计微型机原理与程序设计6)多重循环程序设计多重循环程序指循环体中还有循环程序,又称为循环嵌套。多重循环程序可以简化程序设计,使程序简明、清晰。例例2-3-12 已知在数据段定义有已知在数据段定义有10个字节变量,统计各个变量的二进制形式中个字节变量,统计各个变量的二进制形式中0的个数。的个数。程序举例循环结构微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK设置堆栈段STKDW32 DUP(?)SKSGENDSDASGSEGMENT设置数据段BUFDB23H,10H,00H,28H,1AH,3FH,8BH,92H,0AH,3DHNUM0DB10 DUP(0)DASGENDSCOSGSEGMENT设置代码段ASSUMECS:COSG,DS:DASG,SS:SKSG0000B50BMAIN:MOVAX,DASG00038ED8MOVDS, AX0005B10BMOVAX, SKSG00088ED0MOVSS, AXBC4000MOVSP, SIZE STK000DBMOVDL, 103E00LEADI, NUM000138D360000LEASI, BUF取原数据首址0017B90800NEXT:MOVCX, 8设置循环计数器B600MOVDH, 004MOVAL, SI001ED0E0LOP:SHL, 1判断标志位是否为000207202JCSKIP0022FEC6INCDH0024E8SKIP:LOP00268835MOVDI, DH002847INCDI002946INCSIFECADECDL75E9JNZNEXT002EBMOVAX, 00H0031CD21INT21HCOSGENDSENDMAIN程序举例循环结构微型机原理与程序设计微型机原理与程序设计7)子程序设计举例子程序设计是模块化程序设计的基本技术。当我们编写解决实际问题的程序时,通常会遇到多处使用相同功能的程序段,使用该程序段的唯一差别是对程序变量赋不同的值,这时可以利用子程序段来完成。这种能被其它程序使用的程序段,我们称为子程序,也称为过程。使用它的程序称为主程序或调用程序。使用子程序有以下几点好处: 简化了程序设计过程,减少了工作量,节省了时间; 源程序缩短,节省了机器汇编源程序的时间和存储目标代码的存储空间; 增加了源程序的可读性,便于调试维护; 有利于程序模块化、结构化和自顶向下的程序设计; 子程序一旦编制成功,在开发研制各种软件时都可以利用,大大缩短了软件的开发周期。程序举例子程序结构微型机原理与程序设计微型机原理与程序设计在进行子程序设计时,需要满足以下几个基本要求:具有一定的通用性如果某些应用程序中的一个子程序仅能实现有限的功能,显然其作用有限。但如果将子程序修改,使其能对类似的程序调用都适用,那么这个子程序的作用就大大加强了。影响子程序通用性的因素包括选择那些入口参数以及这些参数的数据格式与结构设置,如何传送等,若在编程前就考虑到这些问题的存在,那么在编程使用时,才能得心应手。注意保存信息子程序虽然是一个独立的程序段,但它执行运算与 *** 作时也要借助于某些寄存器或存储单元。在调用程序中,这些寄存器或存储单元的内容,等子程序返回后要求它们与被调用子程序前保持不变,以便继续进行调用程序的运算与 *** 作。所以,需要进行信息的保护。选择使用的参数传递方法子程序要利用过程定义伪指令声明,获得子程序名和调用属性。主程序执行CALL指令调用子程序,子程序最后利用RET指令返回主程序。主程序在调用子程序时,通常需要向其提供一些数据,对于子程序来说就是入口参数;同样,子程序之行结束也要返回主程序必要的数据,这就是子程序的出口参数。主程序与子程序间通过传递建立联系,相互配合共同完成处理工作。在这过程中实现参数传递方法通常有四种:通过通用寄存器传递、通过约定存储单元传递、借用堆栈传递和通过约定参数地址指针法。程序举例子程序结构微型机原理与程序设计微型机原理与程序设计编写清晰的子程序说明文件编制子程序的目的在于减少编程中某些相同功能程序段的重复书写,以利于自己和他人编写程序是使用。为了使子程序便于阅读、维护、使用,为了明确主程序、子程序之间的联系,明确子程序功能,而使使用者完全不必关心所用子程序的算法及处理过程,一般应编制子程序说明文件,包含下述几项内容:子程序名(子程序入口地址):子程序名(子程序入口地址):用过程(子程序)定义伪指令定义该过程时的过程名,这是过程(子程序)中第一条语句必须是子程序的入口指令;否则应写子程序入口指令的标号或地址;子程序功能:子程序功能: 用自然语言或数学语言等形式简单清楚地描述子程序完成的任务。入口条件:入口条件:说明子程序要求有几个入口参数,这些参数表示的意义及存放位置。出口条件:出口条件: 说明子程序有几个输出参数(运行结果),这些参数表示的意义、存放的位置。受影响的寄存器:受影响的寄存器: 说明子程序运行后,哪些寄存器的内容被破坏了,以便使用者在调用该子程序之前注意保护现场。程序举例子程序结构微型机原理与程序设计微型机原理与程序设计例例2-3-13 将给定的二进制数按位转换成它的将给定的二进制数按位转换成它的ASCII码串,并将转换结果存放到制定码串,并将转换结果存放到制定的存储单元。的存储单元。程序举例子程序结构微型机原理与程序设计微型机原理与程序设计子程序的参考程序如下:BITASCPROCNEAR定义子过程8BC8MOVCX,AX送入口参数至CX0031D2LP:ROLDX,1取1位二进制00332MOV,DL转换一位数的ASCII码00352401ANDAL,01H只取D0位00370430ADDAL,30H00398805MOVDI,AL存转换结构003B 47INCDI指向下一待转换的二进制E3LP循环转换,直至全部转换结束003EC3RETBITASCENDP子程序定义结束程序举例子程序结构微型机原理与程序设计微型机原理与程序设计SKSGSEGMENTSTACKSTACK设置堆栈段STKDW32 DUP(?)SKSGENDSDASGSEGMENT设置数据段BIN8DB72BIN16DW2468ASCBUFDW0DASGENDSCOSGSEGMENT设置代码段ASSUMECS:COSG,DS:DASG,SS:SKSG0000B8BE0BMAIN:MOVAX,DASG00038ED8MOVDS, AX取数据段地址0005B8BA0BMOVAX, SKSG00088ED0MOVSS, AX取堆栈段地址BC4000MOVSP, SIZE STK设置堆栈指针000D360000MOVDH,BIN8取待转换数据0011B80800MOVAX,8设置转换位数800148D3E0300LEADI,ASCBUF取存放码串首址001857PUSHDI保存信息0019E81300CALLBITASC调用转换子程序POPDI恢复信息001D8B160100MOVDX,BIN16取待转换数据0021B81000MOVAX,10H设置转换位数160024710ADDDI,10H取存放码串首址0027E80500CALLBITASC调用转换子程序BMOVAX,00H返回DOS002DCD21INT21HCOSGENDS代码段结束它们的主要差异有:\x0d\x0a1、 子程序调用一定是程序员在编写程序时事先安排好的,是可知的,而中断是由中断源根据自身的需要产生的,是不可预见的(用指令INT引起的中断除外) \x0d\x0a2、 子程序调用是用CALL指令来实现的,但没有调用中断的指令,只有发出中断请求的事件(指令INT是发出内部中断信号,而不要理解为调用中断服务程序); \x0d\x0a3、 子程序的返回指令是RET,而中断服务程序的返回指令是IRET/IRETD。 \x0d\x0a4、 在通常情况下,子程序是由应用程序开发者编写的,而中断服务程序是由系统软件设计者编写的。 \x0d\x0a5、中断方式具有实时性,其可以在函数中的任意位置产生。而子程序调用是编程着写的在程序的特定位置其特定功能的函数。
赞
(0)
打赏
微信扫一扫
支付宝扫一扫
程序清单怎么写
上一篇
2023-05-17
那些从事程序员鼓励师的女孩子,遇到中年危机之后可以干什么?
下一篇
2023-05-17
评论列表(0条)