微机原理及汇编语言汇编语言的程序

微机原理上机
汇编语言程序_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
微机原理上机
汇编语言程序
&&微机原理上机
汇编语言程序
编写如下程序,并在机器上调试成功。程序采用菜单式选择,可以接收用户从键盘输入的五个命令(1-5),各命令功能分别为
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩12页未读,
定制HR最喜欢的简历
你可能喜欢豆丁微信公众号
君,已阅读到文档的结尾了呢~~
从1加到100的微机原理、汇编语言程序,微机原理与汇编语言,微机原理与汇编技术,汇编语言程序设计,汇编语言程序,32位汇编语言程序设计,汇编语言程序设计实验,汇编语言程序设计 pdf,汇编语言延时程序,汇编语言小程序
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
从1加到100的微机原理、汇编语言程序
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口Bad Request
Bad Request - Invalid URL
HTTP Error 400. The request URL is invalid.微机原理汇编语言的上机过程 实验报告_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
微机原理汇编语言的上机过程 实验报告
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩6页未读,
定制HR最喜欢的简历
你可能喜欢当前位置: >>
微机原理第五章:汇编语言程序设计2
5.2汇编语言程序的设计思想程序设计的基本概念5.2.1★ 计算机所执行的每一步工作,必须先由人安排。 对所要解决的问题有一个明确的计算步骤或操作过程,把它用一系列指令或语句描述出来,为求解这个问题所有必须的完整的指令列、语句串加上必要的数据即构成程序。★ 因此,用计算机求解某个问题,首先必须编写出程序,这种编写程序的过程叫做程序设计。 ★ 在进行程序设计时应该考虑满足三个基本要求。 5.2.1 程序设计的基本概念★ 程序的设计应满足三个基本要求: 1.正确性:满足设计的需求,保证程序的正常运行。2.可读性:应尽可能把解题的算法和步骤作出说明或注释,增强程序的可读性,使程序简洁:● ●简:最简化 洁:清晰明了,易读易理解3.可维护性:程序应该是模块化结构;易于调试、修改。 ★ 要达到以上目标,在学习程序设计的过程中,要掌握程序 的基本设计方法和技巧,形成良好风格和素养,并在程序设计的实践中不断总结和提高。 5.2.2 程序设计的基本步聚一、分析问题,建立数学模型●根据实际问题,要全面分析所提供的条件、要求和特点,从中分析找出其规律性,然后抽象出描述该问题的数学模型。●对有些比较简单的问题,不一定非要写出数学模型,但也要用 文字的形式把问题尽量阐述清楚,明确要做的工作。二、确定算法●算法是解决问题的步骤和方法,解决一个问题可能有多种方法, 找出合理的算法以及适当的数据结构就会简化计算机的处理。●计算机仅具有简单的算术和逻辑运算,虽然要解决的问题可以用 数学公式描述,但不一定能在计算机中计算,还需要将这些数学问题转化为近似计算公式,成为计算机能执行的基本操作。 三、绘制程序的流程图用流程图把解决问题的先后执行步骤直观而清晰地描述出来。 是设计程序的好方法,就象写文章、做报告,制定提纲一样。起始框:判断框:Y流向线:处理框:N连接线:终点框:子过程框:程序流程图符号BA 四、安排程序的段结构、分配存储器空间●8086CPU的存储器采用分段管理方式,源程序必须采用段结构, 即在源程序中要分别定义:代码、数据、堆栈及附加段。 程序必须定义在代码段,工作单元可使用数据段中的存储单元, 也可以使用CPU内部的寄存器。●五、编写汇编语言源程序要注意满足程序设计的正确性、可读性和易维护性。六、上机调试、运行程序● ●用 EDIT 编辑程序:编辑、建立ASM源程序(文件名.ASM) 用 MASM 汇编程序: 对源程序汇编,产生目标程序(文件名.OBJ ) 用 LINK 连接程序: 将OBJ文件转换成可执行文件(文件名.EXE)● 5.2.3程序的基本结构★ 程序设计语言的语句、数据有序的组合在一起,对求解的 问题进行描述,就构成了程序;★ 由于有序组合的方式不同,就产生了不同类型的程序结构;一般分为四种基本结构:顺序程序结构 循环程序结构分支程序结构 子程序结构 一、顺序程序结构(简单程序)★ 顺序程序结构有一个起始框、一个至多个矩形框和一个终止框 组成,自上而下按处理框出现的先后顺序执行。 ★ 是最基础和最简单的程序结构; 在程序设计中占主要部分。开始 S1★ 但完全用顺序结构编写的完整程序并不多;这种结构是各种其它程序 结构中的局部程序段:●分支程序就是在顺序程序基础上加上条件判断而构成分支流程; 循环程序中的赋初值程序和循环体S2S3●都是顺序程序结构。★ 它是学习如何编写程序的基础。结束 二、分支程序结构在实际处理问题时,要根据不同的情况和给定条件做出不同的处理。★ 设计这样的程序,须事先把可能出现的各种情况和处理方法都编写在程序中,在执行程序时,根据具体情况做出判断,选择需要 执行的程序段。●按这种要求编写的程序称为分支程序。★ 分支程序的结构有两种形式,如下图所示:双分支结构 多分支结构 三、循环程序结构★ 程序设计中,常遇到需要反复执行某些操作,每次完成这些操作 都是执行同样的程序,只是每一次执行时所需的参数不同而已。 ★ 对这种情况,循环程序结构 是最好的程序设计方法。 ★ 循环程序可以使程序段自动 执行多次,而无需将这段程 序写出多次。使程序大大缩 短,节省内存。 ★ 是一种重要程序设计技巧。 ★ 要善于发现和寻找程序中具 有重复性和规律性的过程。 ★ 循环程序的结构有两种形式, 如右图所示:先 判 断 后 执 行先 执 行 后 判 断 三、循环程序结构循环的准备工作:建立地址指针、设置 计数器初值和其它一些参数的起始值等循环程序核心:程序的重复执行 部分,主要实现循环程序的功能为下一次循环做准备:保证在循环过 程中,操作的数据及地址能按一定 规律进行变化,与循环体协调地工作 保证循环程序按规定的循环次数或 控制循环条件正常循环或结束循环 对循环的结果分析或保存; 有些循环程序不需要这一部分 四、子程序结构(过程)★ 子程序结构是模块化程序设计的重要手段★ 采用子程序结构具有以下优点:1.简化程序设计过程,节约程序设计时间。 2.缩短源程序的长度, 节约存储空间,更重 要的是缩短程序运行CALL NN1子程序体 1……时间。3.增加程序可读性,便 于程序的修改和调试。 4.便于实现程序的模块化和结构化。CALL NN2子程序体 2 5.3常用 DOS 功能调用★ DOS系统不仅为用户提供了许多可以直接使用的命令,而且也提供了80多个可供汇编程序员直接调用的子程序。★ 这些子程序分别用于完成基本输入输出管理、文件管理、 目录管理、内存管理、日期和时间设置及其它多种功能。 ★ 这些功能子程序提供了极大的方便,不必编写这些繁杂 的程序,不必了解有关设备、电路、接口等,只须直接调用即可.★ DOS功能调用是通过软中断方式进行的。 5.3常用 DOS 功能调用软中断的概念--INT n ★ 软中断分为三部分:1.DOS中断:占用 中断类型号 n = 20H ~ 30H● ●目前使用的有 20H ~ 27H、2FH,其余类型号保留未用。 该部分称为 DOS系统功能调用2.ROM-BIOS中断:占用中断类型号 n = 10H ~ 1FH 3.自由中断:占用中断类型号 n = 40H ~ FFH●供用户应用程序设置开发的中断处理服务程序使用。★ 常用的软中断命令有 8 条: 1.中断类型号为:20H ~ 27H,2.它们的功能及入口、出口参数如下表: 常用的软中断命令 5.3.1 DOS 功能调用方法★ 为方便使用功能调用子程序,DOS 系统将所有子程序进行编号。 ★ 称编号为功能号,调用时只要按如下步骤编写程序即可。 调用的步骤如下: 1.将调用的功能子程序的功能号送 AH 寄存器;2.根据调用功能子程序的入口条件将入口参数送入到规定的寄存器或存储单元;3.执行软中断指令 INT 21H ,即转入功能子程序;4.相应功能子程序执行完后,获取输出参数。 常用 DOS 功能调用一览表功能号 01H 02H 功 能 入 口 参 数 出口参数 AL=输入字符 DL=输出字符带回显的键符输入 字符显示03H04H 05H串行口输入字符串行口输出字符 字符打印 DL=输出字符 DL=输出字符AL=输入字符07H08H 09H无回显键符输入无回显键符输入 字符串显示 DS:DX=显示缓冲区首址AL=输入字符AL=输入字符0AH0BH字符串缓冲输入取键盘输入状态DS:DX=显示缓冲区首址AL=00H无键入 AL=FFH无键入 5.3.2常用 DOS 功能调用简要说明及应用一、键盘输入功能调用① 1 号 功能调用:带回显的键符输入 格式:MOV AH,1 INT 21H ;功能号送AH寄存器 ;调用功能子程序功能:等待将从键盘输入的一字符送入AL寄存器,有键按下时, 系统检查是否是 Ctrl-Break 键,如果是则退出,否则将 字符的ASCII码值送入AL,并在屏幕上显示该字符。 ② 7 号功能调用:无回显键符输入功能与1号功能类似,不同的是:不回显也不检查 Ctrl-Break 键。③ 8 号功能调用:无回显键符输入功能与1号功能调用类似,检查Ctrl-Break 键,但不回显。 一、键盘输入功能调用④ 0AH 号功能调用:字符串缓冲输入 格式:LEA DX,D1 MOV AH,0AH INT 21H ;DX指向内存缓冲区,入口参数 ;功能号送AH寄存器 ;调用功能子程序功能:等待将从键盘输入的字符串写入特定的内存缓冲区。★ 使用0AH号功能调用,先要在数据段定义输入缓冲区★ 缓冲区的第一个字节用于说明输入字符的个数,第二个字节用 于存放实际输入的字符个数,从第三个字节开始存放从键盘输 入的字符串;键入回车键表示字符串 输入结束。 ★ 调用前,要求 (DS:DX)指向输入内存缓冲区的首地址。 二、键盘输出功能调用① 2 号功能调用:字符显示格式:MOV DL,‘A‘ MOV AH,2 INT 21H ;将显示的字符送 DL,入口参数 ;功能号送AH寄存器 ;调用功能子程序功能:是将存于DL寄存器中的字符在屏幕上显示出来。 例如:当执行完上面程序段后,就在屏幕上显示一个字母?A‖ 二、键盘输出功能调用② 9 号 功能调用:字符串显示 格式:LEA DX,BUF MOV AH,09H INT 21H ; DX指向显示缓冲区,入口参数 ;功能号送AH寄存器 ;调用功能子程序功能:将指定内存缓冲区中的字符串在屏幕上显示出来。 ★ 它要求被显示的字符串必须以?$‖字符作为结束符。 ★ 调用前,要求(DS:DX)指向显示缓冲区的首地址。 5.3.3 实现返回操作系统的常用方法★ 用户程序运行完后须返回操作系统,否则会出现死机现象。 ★ 在此简单介绍通过功能调用实现返回操作系统的常用方法。 ① INT 20H◆在编写程序段并用DEBUG.COM调试程序时往往使用此方法。② MOV AH ,4CH INT 21H◆编写汇编语言源程序时往往使用此方法,该方法是最常用的方法。③ PUSH DS MOV AX ,0 PUSH AX◆该方法与子程序中的RET指令配合来实现返回操作系统,相当于 执行一条 INT 20H 指令,与程序段前缀(PSP)有关。 5.45.4.1汇编语言程序上机调试过程汇编语言源程序的上机过程★ 汇编语言源程序,须经以下几步,才能对程序进行调试和运行。 一、编辑:用编辑程序建立扩展名为.ASM 的汇编语言源程序文件二、汇编:用汇编程序将扩展名为.ASM 文件汇编成目标程序文件,其扩展名为.OBJ 文件。 ★ 当.ASM 文件中有语法错误,汇编结束后汇编程序将给出提示,如:位置、类型、说明等;★ 用户根据提示用编辑软件重新调入.ASM 文件进行修改,直至 没有出现语法错误,才产生目标程序。然后再进行连接; ★ 经汇编程序对 .ASM 文件进行汇编,将.ASM源文件程序转换 成二进制代码表示的扩展名.OBJ 目标程序文件; 5.4.1汇编语言源程序的上机过程三、连接:用连接程序将.OBJ 文件转化成扩展名为.EXE 文件 四、调试:用调试程序对.EXE可执行文件进行调试,到无错为止。 此时的可执行文件在 DOS命令下直接执行。 ★ 以上过程如下图所示:Edit.com编 辑 程 建立.ASM 文件Masm.exe汇 编 程 形成.OBJLink.exe连 产生.EXE 文件 出 错Debug.com调 试 程 序 出 错文件出 错接 程序序序 5.4.2调试程序 DEBUG.COMDEBUG.COM 用于试验和检测用户程序★ 一般语法错误和格式错误可以通过汇编和连接程序发现并指出, 但逻辑错误必须用 DEBUG.COM 调试程序来排除 ★ 调试程序功能:设置断点、启动地址、单步跟踪、子程序跟踪、 条件跟踪、检查修改内存和寄存器、行汇编和反汇编等。 ★ DEBUG程序的调用:在DOS 提示符下键入 DEBUG,随后键入用户文件名,则DEBUG将指定的文件装入内存中,即可调试;◆如果未键入文件名,可用DEBUG的N命令和L命令把需要的文件 装入内存后再进行调试。◆在调入DEBUG程序后,将出现提示符?一?,表示已进入DEBUG 此时就可以调试程序了。 ★ DEBUG程序对寄存器和标志位的初始化在调入DEBUG程序后,它把各寄存器和标志位置成以下状态: 1.段寄存器(CS, DS, ES、SS))置于自由存储空间的底部,也就是 DEBUG 程序结束以后的第一个段。2.指令指针(IP)置为0100H。 3.堆栈指针置于段的结尾处或装入程序的临时底部,取决于哪一个 更低。 4.余下的AX、 BX、 CX、 DX、 BP、 SI和DD置为0。5.标志位都置为清除状态。6.默认的磁盘缓冲区置于代码段的80H。 注意:若由DEBUG调入的程序具有扩展名.EXE, 则 DEBUG 必须进行再分配,把段寄存器、堆找指针置为程序中所规定的值。 ★ DEBUG 的主要命令及功能(1) ★ DEBUG 的主要命令及功能(2) 5.55.5.1汇编语言程序设计顺序结构程序设计(简单程序)★ 是最基础 和最简单的程序结构 ★ 顺序结构在程序设计中占主要部分 一、表达式计算开始 S2S2 S3 结束例1:已知 Y = X? + 8X? + 8X + 6,求 当 X = 10 时, Y 的值。解:先将原公式变形为: Y = [(X+8)× X + 8 ]×X + 6 例 1: Y = [(X+8)× X + 8 ]×X + 6开始;源程序,以下是段定义 DATA SEGMENTX → AXAX+8 → AX AX×X →AX AX+8 → AX AX×X →AX AX+6 → AX AX→ Y 结束X DW 10Y DW 0 DATA ENDSSTACK SEGMENTSTA DW 100 DUP(?) TOP EQU SIZE STASTACK ENDSCODE SENGMENT ASSUME DS:DATA ASSUME SS:STACK ASSUME CS:CODE 例 1: Y = [(X+8)× X + 8 ]×X + 6 START:MOV AX,STACK MOV SS,AX MOV SP,TOP MOV AX,DATA MOV DS,AX MOV AX,X ADD AX,8 MUL X ADD AX,8 MUL X ADD AX,6 MOV Y,AX MOV AH,4CH INT 21H CODE ENDS END START ;主程序开始;以上是断寄存器赋值;运算结果送Y单元 ;用软中断功能退出用户程序 ;代码断结束 ;程序结束 例 2:变量M为压缩 BCD码;将其转换为相应 的 ASCII 码,存入M 后的两个单元中。DATA SEGMENT M DB ? N DB 2 DUP(?) DATA ENDS CODE SEGMENT ASSUME DS:DATAADD AL,30HMOV [DI],AL MOV AL,[SI] MOV CL,4 SHR AL,CL ADD AL,30H MOV [DI+1],ALASSUME CS:CODESTR:MOV AX,DATA MOV DS,AX LEA SI,M LEA DI,N MOV AL,[SI] AND AL,0FHMOV AH,4CHINT 21H CODE ENDSEND STR 二、查表程序 ★ 对于计算平方值、立方值、方根、三角函数等一些复杂的运算, 无一定的算法关系,可以采用查表的方法解决。 ★ 查表的关键在于组织表格。表格中应包括所有可能的值,且按 顺序排列。 ★ 查表操作是利用表格首址加上索引值得到结果所在的单元地址,索引值通常就是被查的数值。例:在内存中自TABLE单元起连续存放着0 ~15的平方值,查表求 X 的平方值并送入Y 单元中。(0 ≤ X ≤ 15) 程序流程图开始 表首址送BX X→AL(BX+AL) →AL(AL) →Y 结束DATA SEGMENT TABLE DB 0,1,4,9,16,25,36,49,64 DB 81,100,121,144,169,225 X DB 13 Y DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA BX,TABLE MOV AL,X XLAT MOV Y,AL MOV AH,4CH INT 21H CODE ENDS END START 5.5.2分支结构程序设计★ 采用分支程序结构可使程序在运行时,根据不同的结果条件 通过条件转移指令有选择地执行相应的处理程序。 ★ 但必须将可能出现的情况和处理方法都预先编写在程序中。★ 分支的类型 :1.两分支程序结构; ★ 实现分支的两个要素: 1.使用能影响 FR 的指令,将状态标志做为判别的条件 2.使用条件转移指令,根据状态标志确定转移的去向 2.多分支程序结构 一、简单的双分支程序设计◆ ◆双分支程序是组成其它复杂程序的基础 设计步骤: 1.确定需要判断的条件,根 据条件选择条件转移语句;开始 初始化 操作数指针送SI 带符号数送X2.确定条件成立时和条件不 成立时所要完成的任务; 3.画出程序流程图并写出源程序。 例 1:内存单元 M 中有一个16位带符号数, 求其绝对值,将结果放回原处。绝对值送M 结束小于零吗?NY 求补 DATA SEGMENT 源程序 M DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,ASSUME DS:DATA START:MOV AX,DATA MOV DS,AX LEA SI,M MOV AX,[SI] AND AX,AX ;利用?与?对符号标志产生影响 JNS DONE ;SF = 0,转移到 DONE NEG AX ;SF = 1,AX & 0,AX 求补 DONE:MOV [SI],AX MOV AH,4CH INT 21H CODE ENDS END START 二、复杂的多分支程序设计★ 多分支结构有若干个条件,每一个条件对应一个基本程序段。 ★ 程序判断产生的条件,哪个条件成立,就执行对应的程序段。 ★ 实现多分支结构的方法有:◆条件选择法◆转移表法◆地址表法1、条件选择法(见例 5-15) 一个条件选择指令可以实现两路分支,多个条件选择指令 即可实现多路分支。这种方法适用于分支数较少的情况。 2、转移表法(见例 5-16)◆ ◆把转移到各分支程序段的转移指令依次排,形成 转移表。 把距离表首单元的偏移量作为条件来判断各分支转移指令在表中 的位置。◆进行多分支条件判断时,把当前的条件――偏移量加上表首地址作为转移地址,转移到表中的相应位置去执行无条件转移指令, 达到实现多分支的目的3、地址表法(见例 5-17)◆与转移表法不同,转移表位于代码段,存放的是转移指令;◆◆而地址表位于数据段,存放的是分支程序段的入口地址。如果是段内转移,则入口地址为段内偏移地址,占用一个字单元; 如果是段间转移,则入口地址为32位地址指针,占用两个字单元。 例 5-15: 编写程序,完成下面分段函数的计算。 (X为单字节带符号数据) 1 X&0Y=0-1X=0X&0解: X 为内存中的一个带符号数, 先判断其正负,若为负:函数值 Y 为-1 ;若为正,再判断是否为 0,如果为0,函数值为 0;否则函数值为1。 程序流程图开始X → AL AL≥ 0 ? Y PLUSN-1→BL EXIT BL → Y 结束AL= 0 ?N 1 → BLYZERO0 → BL SEGMENT 汇编语言源程序 DB ? DB ? END SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,X ;X 取到AL中 CMP AL,0 ;AL中的内容和 0比较 JGE PLUS ;大于等于0,转PLUS MOV BL,-1 ;否则为负数,-1送BL JMP EXIT ;转到结束位置 PLUS: JE ZERO ;AL中的内容是否为 0,为 0 转ZERO MOV BL,1 ;否则为大于 0,1送BL JMP EXIT ;转到结束位置 ZERO:MOV BL,0 ; 0 送BL EXIT: MOV Y,BL ;BL中的内容送Y单元 MOV AH,4CH INT 21H ;程序结束 CODE ENDS END START ;汇编结束DATA X Y DATA CODE 5.5.3循环结构程序设计★ 对某些要反复执行多次的程序段,可将此程序段做为循环体放在 主程序中,而不是重复写多次,这样可以简化程序的结构和数量。一、循环程序由五部分组成:① 初始化参数; ② 循环体部分; ③ 修改参数部分; ④ 控制部分; ⑤ 结束处理二、循环程序的基本结构形式 ① ?先执行、后判断?结构;最少要执行一次循环体 ② ?先判断、后执行?结构;可以不执行循环体三、循环结构的类型① 单重循环结构:循环体内只包含有顺序结构和分支结构 ② 多重循环结构:循环体内还包含有循环结构 5.5.3循环结构程序设计一、单重循环结构程序的设计 ★ 循环体内只包含有顺序结构和分支结构的程序 ★ 设计单重循环结构程序的关键是掌握循环程序的控制方法★ 常用循环程序的控制方法有:◆计数控制法◆条件控制法◆混合控制法◆逻辑尺控制法1.计数控制法 [例 5-19 ] ☆ 当循环次数是已知或可求的情况下,可采用计数法控制循环。 ☆ 常用两种方法实现计数控制: ① 正计数法,即计数器从 1 加一计数到 N; ② 倒计数法,即计数器从 N 减一计数到 0 。 2.条件控制法 [例 5-20 ] ☆ 有些问题循环次数预先不能确定,只能按照循环过程中的某个 特定条件是否成立来决定循环是否继续执行; ☆ 此类问题可通过测试条件是否成立来实现对循环的控制。 3.混合控制法 [例 5-21 ] ☆ 混合控制法是前两种控制方法的结合。☆ 循环结束的条件是:达到预定循环次数或退出循环的条件成立。4.逻辑尺控制法 [例 5-22 ] ☆ 当循环体中的处理部分为分支程序,便构成分支循环结构。 ☆ 实际应用中常用逻辑尺来实现控制分支和循环。 ☆ 逻辑尺就是一个存储单元,单元中的每一位是一个标志,根据位 为?0 ‖或为?1‖的状态可实现两路分支,多个标志即可重复地实现 分支。重复的次数就是逻辑尺中设定的位数。 计数控制法举例◆数据段以 BUF 为首址的区域中, 存有 COUNT 个有符号字节数。请分别 统计正数和负数的个数,将结果送 MI 和 PL 单元中。解:循环次数已知,用正计数法。 用BL计数正数的个数 用DL计数负数的个数 用 SI 做地址指针 用CX做循环计数器 源程序DATA SEGMENT BUF DB -32,25,…… COUNT EQU $ ― BUF MI DB 0 ;正数个数 PL DB 0 ;负数个数 DATA ENDS CODE SEGMENT ASSUME DS:DATA ASSUME CS:CODE STA:MOV AX,DATA MOV DS,AX LEA SI, BUF MOV CX, 0 MOV BL,0 ;计正数个数 MOV DL,0 ;计负数个数 L1:MOV AL,[SI] CMP AL,0 JGE MM INC DL JMP NT MM:INC BL NT:INC SI INC CX CMP CX,COUNT JNE L1 MOV MI,BL MOV PL,DL MOV AH,4CH INT 21H CODE ENDS END STA 条件控制法举例:◆字符送AL $ 字符 ?统计字符串STRING中空格的个数。DATA SEGMENT NET STRING DB ‘ Where is a …… way,$‘ RESULT DW ? 空格符? CNT DATA EDNS CODE SEGMENT 计数器DX加一 ASSUME DS:DATA ASSUME CS:CODE STA:MOV AX,DATA 修改地址指针BX MOV DS,AX FIN LEA BX,STRING MOV DX,0 CNT:INC BX FIN :MOV AL,[BX] JMP FIN CMP AL,’$‘ NET:MOV RESULT,DX JE NET MOV AH,4CH CMP AL,20H INT 21H JNE CNT CODE ENDS INC DX END STA 逻辑尺控制法举例:◆ 数据组 X 和 Y 中各有10个数据,编写程序计算并把结果存入数组 Z 中:Z1=X1+Y1,Z2=X2+Y2,Z3=X3-Y3,Z4=X4-Y4,Z5=X5-Y5Z6=X6+Y6,Z7=X7-Y7,Z8=X8-Y8,Z9=X9+Y9,Z10=X10+Y10分析: ① 已知循环次数为10次,每次把数组 X 和 Y 中的对应元素分别进行 处理,循环的操作数可以顺序取出,但要做的处理却不同。 ② 为区别每次的处理,用存储单元中的位做为相应的标志位: 标志为 0 表示做加法,标志为 1 表示做减法。 存放逻辑操作标志的单元称为 ? 逻辑尺 ? 。 ③ 在程序流程中,通过测试标志位来确定相应的操作。 ④ 本例要进行十次操作,需十个逻辑位, 用LR字单元作为逻辑尺, 内容为:01 1100 B = 00DCH,由低位到高位开始 表示每次要做的操作。最高 6 位没有意义,可设为 0 。 流程图SB LLLP DATA SEGMENT X DW X1, …… ,X10 Y DW Y1, …… ,Y10 Z DW 10 DUP(?) LR DW 0DCH DATA ENDS CODE SEGMENT ASSUME DS:DATA ASSUME CS:CODE STA:MOV AX,DATA MOV DS,AX MOV CX,10 MOV DX,LR SUB BX,BX LP:MOV AX,X[BX] SHR DX,1 JC SB ADD AX,Y[BX] JMP LL SB:SUB AX,Y[BX] LL:MOV Z[BX],AX源程序LLSB流程图LPADD BX,2 LOOP LP MOV AH,4CH INT 21H CODE ENDS END STA 二、多重循环结构程序的设计★ 有些比较复杂的问题,单重循环难以解决,须采用多重循环结构。 ★ 多重循环是指循环体内又包含循环结构,又称为循环嵌套。 ★ 在使用多重循环时要特别注意以下几点: 1.内循环必须完整地包含在外循环内,即内、外循环不能相互交叉。 2.内循环在外循环中的位置可根据需要任意设置,在分析程序流程 时要避免出现混乱。 3.在外循环中,可以几个内循环并列存在。◆ ◆可以从内循环直接跳到外循环; 但不能从外循环直接跳到内循环中。4.无论是内循环,还是外循环,千万不要使循环回到初始化部分, 以防止出现死循环。并注意各循环体的初始参数设置和循环参数 的修改,避免混乱和出错。 5.每次完成外循环再次进入内循环时,初始条件必须重新设置。 D多重循环?结构外循环内 循 环见 [例 5-23 ] 5.5.4一、子程序的基本概念子程序设计★ 对于具有独立功能的、在程序中要经常使用的程序段,我们可以 将其定义为过程(子程序)。★ 子程序被单独安排在存贮器的一个区域内。★ 在主程序中安排 CALL 指令去调用子程序(转子),过程结束时, 由安排在过程中的 RET 指令使其返回到调用处(返主)。● ●CALL 指令的目的操作数一般为符号名(过程名)。 段内调用:类型为 NEAR; 段间调用:类型为 FAR 二、子程序说明信息★ 用于说明此子程序的功能和调用方法。以便使子程序具有通用性。 ★ 在子程序定义前,以注释行的形式出现。 ★ 说明文件一般具有以下几项内容:◆ ◆ ◆ ◆子程序名:取具有象征意义的子程序名 子程序功能:说明子程序完成的具体功能 输入参数:有哪些参数需输入;参数的传递方法 输出参数:结果有哪些,如何传递出来◆◆ ◆子程序中占用哪些寄存器,占用哪些内存单元,是否有保护措施嵌套情况:以便决定使用时,开辟栈区的大小 给出调用示例:如 DOS 功能调用的示例 三、保护现场与恢复现场★ 主程序和子程序中都需要使用寄存器。 子程序中所使用的寄存器可能在主程序 中正在使用,其中的数据在返回主程序 后还要使用,必须对这些数据进行保护。 ★ 这种工作称为:保护现场 ★ 在返回主程序前,要将保护的内容恢复。 这种工作称为:恢复现场 ★ 保护和恢复现场工作一般安排在子程序 中进行 1.进入子程序,首先对子程序中要使用的 寄存器进行压栈保护; 2.当子程序执行完毕,在执行 RET 指令前, 进行出栈操作,对现场进行恢复。SUM PROC FAR保 护 现 场 PUSH AX PUSH DX . . . . PUSH FR . . . . . . . POP FR . . . . POP DX POP AX RET子 程 序恢 复 现 场SUM ENDP 四、参数传递方法输入参数:执行子程序中需要一些数据(参数),因此在调用子程序时,要将这些参数传递给它。输出参数:子程序执行的结果(数据)。参数的传递一般有三种方式1.用寄存器传递参数: 由于寄存器较少,适用于参数量较少的情况。 ☆ 要约定好输入参数、输出参数占用的寄存器 ☆ 调用子程序前,将输入参数放在协议好的 REG 中 ☆ 返回主程序前,应将输出参数放在 REG 中 四、参数传递方法2.用堆栈传递参数:按照约定 ☆ 在调用子程序前 将输入参数压入栈区;进入子程序后,将输入参数出栈。 ☆ 在返回主程序前 将结果参数压入栈区;回到主程序后,将结果出栈。◆ 注意:断点的保护问题使用 CALL 指令时自动将断点压入栈区;所以进入子程序后, 栈顶是断点。在使用 RET 指令前,应将断点放在当前的栈顶。 3.用存贮单元传递参数: ☆ 其方法类似堆栈传递参数。最好用一个专用数据区,如扩展段。 ☆ 要制订好参数传递的有关协议(约定)。 五、子程序的嵌套与递归★ 嵌套:◆◆子程序的嵌套是指一个子程序调用另一个子程序。子程序可以多次嵌套,嵌套的层数不受限制。主要取决于堆栈 空间的大小,断点,保护现场需要占用堆栈的空间。 要正确使用 CALL 和 RET 指令,注意保护和恢复寄存器,避免 各层子程序之间因寄存器使用冲突而发生错误。◆★ 递归:◆一个子程序可以调用自身,称递归调用。 六.子程序设计举例:主程序两次调用子程序,对不同数组求和。DATA SEGMENT ARA DB A1,A2,… … ; C1 EQU $ C ARA SUA DW ? ARB DB B1,B2, … … ; C2 EQU $ C ARB SUB DW ? DATA ENDS STCK SEGMENT STK DW 100 DUP(?) TOP EQU $ - STK STCK ENDS CODE SEGMENT ASSUME DS:DATA ASSUME SS:STCK ASSUME CS:CODEMAIN:MOV AX,DATA MOV DS,AX MOV AX,STCK MOV SS,AX MOV SP,TOP LEA SI,ARA LEA DI,SUA MOV CX,C1 CALL SUM LEA SI,ARB LEA DI,SUB MOV CX,C2 CALL SUM MOV AH,4CH INT 21H CODE ENDS 六.子程序: 子程序 SUM 的功能是对字节数组求和,用寄存器传递参数;子程序名 SUM ;对字节数组求和 ;SI = 数组起始地址 ;CX = 数组长度 ;DI = 数组和的目的地址 SUM PROC NEAR PUSH AX PUSH BX MOV AX,0 LP:MOV BL,[SI] MOV BH,0 ADD AX,BXINC SILOOP LP MOV [DI],AX POP BX POP AX RET SUM ENDPEND MAIN Debug 中标志位相应的提示符标志位名 OF DF IF SF ZF AF PF CF 为1对应符 OV DN EI NG ZR AC PE CY 为0对应符 NV UP DI PL NZ NA PO NC 实验二:流程图 大小写字母转换成大写字母开始 初始化 AL←取一个字符 是大写吗? AL←AL-20H存放转换结果CX-1= 0? 结束 实验二: 大小写字母转换成大写字母DATA SEGMENT NN DB ? aBcdEfghij ‘ MM DB 10 DUP(?) DATA ENDS CODE SEGMENT ASSUME DS:DATA ASSUME CS:CODE START:MOV AX,DATA MOV DS,AX LEA SI,NN LEA DI,MM MOV CX,10 J1:MOV AL,[SI] CMP AL,61H JL L1 SUB AL,20H L1:MOV [DI],AL INC SI INC DI LOOP J1 MOV AH,4CH INT 21H CODE ENDS END START 实验三:DOS功能调用――大小写字母显示 adata segment buf db 40 db ? db 40 dup(?) max db 41 dup(?) min db 41 dup(?) data ends stck segment aa dw 100 dup(?) stck ends code segment assume ds:data,ss:stck assume cs:code start:mov ax,data mov ds,ax mov ax,stckmov ss,ax mov sp,size aa lea di,max lea bx,min lea dx,buf mov ah,0ah int 21h mov cl,buf+1 mov ch,0 lea si,buf+2 j1:mov al,[si] cmp al,61h jb l1 mov [bx],al sub al,20h mov [di],al 实验三:DOS功能调用――大小写字母显示 bjmp l1:mov add mov l2: inc inc inc loop mov mov mov mov int mov mov intl2 [di],al al,20h [bx],al si di bx j1 byte ptr [di],'$' byte ptr [bx],'$' dl,0ah ah,2 21h dl,0dh ah,2 21hmov dx,offset max mov ah,9 int 21h mov dl,0ah mov ah,2 int 21h mov dl,0dh mov ah,2 int 21h mov dx,offset min mov ah,9 int 21h mov ah,4ch int 21h code ends end start 实验三: DOS功能调用 ――成绩显示流程图 DATA SEGMENT BUFF DB 67,… … … S DB 4 DUP (0) DATA ENDS CODE SEGMENT ASSUME CS: CODE,DS: DATA START:MOV AX,DATA MOV DS,AX LEA BX,BUFF MOV CX,30 LP1:MOV AL,[BX] CMP AL,80 JAE LG80 CMP AL,70 JAE LG70 CMP AL,60 JAE LG60实验三:INC S JMP LL LG80:INC S+3 JMP LL LG70:INC S+2 JMP LL LG60:INC S+1 LL:INC BX DEC CX JNZ LP1 MOV AH,4CH INT 21H CODE ENDS END START 实验四:子程序结构设计DATA SEGMENT BUFF DB 67,…… … …; D1 DB ? &60:$ ? ;定义字符串 D2 DB ‘60-69:$‘ ;定义字符串 D3 DB ‘70-79:$‘ ;定义字符串 D4 DB ‘80-100:$‘ ;定义字符串 S DB 4 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX LEA BX,BUFF MOV CX,36 ;循环值 LP1:MOV AL,[BX] ;取成绩显示成绩aCMP AL,80 ;与80比较 JAE LG80 ;≥转移 CMP AL,70 ;与70比较 JAE LG70 ; ≥转移 CMP AL,60 ;与60比较 JAE LG60 ; ≥转移 INC S ;小于60的数加一 JMP LL ;转移修改参数 LG80:INC S+3 ; ≥ 80的数加一 JMP LL ;转移修改参数 LG70:INC S+2 ; ≥ 70的数加一 JMP LL ;转移修改参数 LG60:INC S+1 ; ≥ 60的数加一 LL:INC BX ;修改参数 DEC CX ;循环值减一 实验四:子程序结构设计 显示成绩 bJNZ LP1 LEA DX,D1 MOV AH,9 INT 21H MOV CL,S CALL MMU LEA DX,D2 MOV AH,9 INT 21H MOV CL,S+1 CALL MMU LEA DX,D3 MOV AH,9 INT 21H MOV CL,S+2 CALL MMU ;CX不为零循环 ;显缓首址送DX ;9号功能调用 ;显示字符串 ;显示值送CL ;调用显示子程序 ;显缓首址送DX ;9号功能调用 ;显示字符串 ;显示值送CL ;调用显示子程序 ;显缓首址送DX ;9号功能调用 ;显示字符串 ;显示值送CL ;调用显示子程序 LEA DX,D4 MOV AH,9 INT 21H MOV CL,S+3 CALL MMU MOV AH,4CH INT 21H ;定义显示子程序 MMU PROC NEAR MOV DL,0 L1:CMP CL,10 ;与10比较 JB L2 SUB CL,10 ; >10减一 INC DL ;10加一 JMP L1 L2: OR DL,30H ;ASCII码 实验四:子程序结构设计 显示成绩 cMOV AH,2 ;2号功能调用 INT 21H L3::MOV DL,CL OR DL,30H ;转换成ASCII码 MOV AH,2 ;2号功能调用 INT 21H MOV DL,0AH ;回车符送DL MOV AH,2 ;2号功能调用 INT 21H MOV DL,0DH ;换行符送DL MOV AH,2 ;2号功能调用 INT 21H RET MMU ENDP ;子程序定义结束 CODE ENDS ;段定义结束 END START 实验四:子程序结构设计 y=a2+b2+c2 (1)data segment a db ? b db ? c db ? y dw 0 cy db 0 ;六千计数 data ends code segment assume ds:data assume cs:code stat:mov ax,data mov ds,ax mov bl,a call mmu mov bl,b call mmubl,c mmu disp ah,4ch 21h ;定义子程序mmu mmu proc near mov al,bl mul bl add y,ax cc:jnc rr add cy,6 add y,5536 jmp cc rr:ret mmu endp ;子程序结束mov call call mov int 实验四:子程序结构设计 y=a2+b2+c2( 2);定义子程序 disp disp proc near mov dl,0 mov bx,y ll: cmp bx,10000 jb l1 sub bx,10000 inc cy jmp ll l1:cmp cy,10 jb l11 sub cy,10 inc dl jmp l1 l11: add dl,30h mov ah,2 int 21hmov dl,cy add dl,30h mov ah,2 int 21h xor dl,dl nn:cmp bx,1000 jb n1 sub bx,1000 inc dl jmp nn n1: add dl,30h mov ah,2 int 21h xor dl,dl mm:cmp bx,100 jb m1 实验四:子程序结构设计 y=a2+b2+c2 (3)sub inc jmp m1:add mov int mov pp:cmp jb sub inc jmp p1:add mov intbx,100 dl mm dl,30h ah,2 21h dl,0 bx,10 p1 bx,10 dl pp dl,30h ah,2 21hmov dl,bl add dl,30h mov ah,2 int 21h ret disp endp ;子程序结束 code ends ;代码断结束 end stat 实验二: 1 、以 ASCII 码显示 BCD 码 DATA SEGMENT BCD DW 5678H DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV AX, BCD MOV BX, AX MOV CL, 4 SHR AH, CL ADD AH, 30H MOV DL, AH;取 BCD 码 ;保存BCD 码MOV AH, 2 INT 21H MOV AL, BL;2号功能调用 ;取低字节 ;屏蔽高四位 ;转换成 BCD 码 ;BCD 码送 DL ;2号功能调用 ;换行符送DL ;2号功能调用 ;回车符送DL ;2号功能调用;高字节右移四位 ;转换成 BCD 码 ;BCD 码送 DLAND AL, 0FH OR AL, 30H MOV DL, AL MOV AH, 2 INT 21H MOV DL, 0AH MOV AH, 2 INT 21H MOV DL, 0DH MOV AH, 2 INT 21H MOV AH, 4CH INT 21H CODE ENDS END STARTMOV AH , 2INT 21H MOV AH, BH AND AH, 0FH OR AH, 30H MOV DL, AH MOV AH, 2 INT 21H MOV AL, BL SHR AL, CL OR AL, 30H;2号功能调用;取高字节 ;屏蔽高四位 ;转换成 BCD 码 ;BCD 码送 DL ;2号功能调用;取低字节 ;低字节右移四位 ;转换成 BCD 码MOV DL, AL; BCD 码送 DL 实验二:2、 二进制数 转换 为 BCD 码DATA SEGMENT D1 DW 3039HD2 DB 7 DUP (0)DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV AX, D1 XOR BL, BL LA1: CMP AX, 10000 ;二进制数送AX ;BL清零 ;与一万比较JB LA2SUB AX, 10000 INC BL JMP LA1;小于转移;减去一万 ;万位值加一 ;继续判别
LA2:OR BL,30H;转换成 BCD 码LD1: CMP AX,10;与一十比较MOV D2, BLMOV BL,0 LB1: CMP AX,1000 JB LB2 SUB AX,1000 INC BL JMP LB1 LB2:ADD BL,30H;送显示缓存区;BL 清零 ;与一千比较 ;小于转移 ;减去一千 ;千位值加一 ;继续判别 ;转换成 BCD 码JB LD2SUB AX,10 INC BL JMP LD1 LD2:OR BL,30H MOV D2+3,BL OR AL,30H MOV D2+4,AL MOV D2+5,'$';小于转移;减去十 ;十位值加一 ;继续判别 ;转换成 BCD 码 ;送显示缓存区 ;个位转换成BCD码 ;送显示缓存区 ; '$'送显示缓存区MOV D2+1,BL ;送显示缓存区XOR BL, BLLC1: CMP AX,100 JB LC2 SUB AX,100 INC BL JMP LC1 LC2:OR BL,30H MOV D2+2,BL XOR BL,BL;BL 清零;与一百比较 ;小于转移 ;减去一百 ;百位值加一 ;继续判别 ;转换成 BCD 码 ;送显示缓存区 ;BL 清零 存区LEA DX,D2MOV AH,9 INT 21H MOV DL,‘;‘ MOV AH,2 INT 21H MOV AH,4CH INT 21H; DX指向显示缓存区;9号功能调用 ; ‘;'送显示缓 ;2号功能调用CODE ENDSEND START 实验三: DOS 功能调用MOV CH,0;CX高字节清零2、由键盘输入字符串分类统计个数DATA EGMENT BUFFER DB 50 DB ? ;建立输入缓存区MOV CL,[SI]INC SI MOV AX,0 MOV DX,0;字符个数送CL;指向输入缓存区DB 50 DUP(?)RESULT DB 4 DUP(?) DATA ENDS CODE SEGMENT ;统计结果缓存区LOOP1:CMP BYTE PTR[SI],30H JB EXIT JBE L2 JB EXIT JBE L1 ;不是数字、字母,转移 ;是数字转移 ;不是数字、字母,转移 ;是大写字母转移 CMP BYTE PTR[SI],39H CMP BYTE PTR[SI],41H CMP BYTE PTR[SI],5AH ;缓存区首址送DX ;10号功能调用 ;等待输入字符串 ;结果首址送SI CMP BYTE PTR[SI],61HASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA DX,BUFFER MOV AH,10 INT 21H LEA SI,BUFFER INC SIJB EXITJBE L1 EXIT:INC DL;不是数字、字母,转移;是小写字母转移 ;非数字、字母个数加一CMP BYTE PTR[SI],7AHJMP DONE;转移 L1:INC AH JMP DONE L2:INC AL DONE:INC SI LOOP LOOP1;字母个数加一 ;转移 ;数字个数加一 ;修改参数,指向下一字符 ;CX减一不为零循环 ;结果缓存区首址送SIL4:MOV DL,0AHMOV AH,02HINT 21H MOV DL,0DH MOV AH,02HLEA SI,RESULT MOV [SI],DHINT 21HMOV DL,BH OR DL,30H MOV AH,02H INT 21H MOV DL,BL OR DL,30H MOV AH,02H INT 21H INC SI LOOP LOOP2 MOV AH,4CH INT 21HMOV DH,BUFFER+1 ;输入字符个数送DH MOV [SI+1],AH ;字母个数送缓存区 MOV [SI+2],AL ;数字个数送缓存区 MOV [SI+3],DL ;非字母数字个数送缓存区 MOV CX,4 ;循环值送CXLOOP2:MOV BL,[SI]XOR BH,BH L3:CMP BL,10 JB L4SUB BL,10INC BH JMP L3CODE ENDSEND START 实验四循环程序结构设计1、小写字母转换成大写字母 DATA SEGMENT D1 DB 255 DUP(0) DATA ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE STAR:MOV AX,DATA MOV DS,AXMOV BX,OFFSET D1XOR SI,SI LL:MOV AH,1 INT 21H CMP AL,41H JB SHOW CMP AL,5AH JBE LOAD CMP AL,61H JB SHOW CMP AL,7AH 实验四循环程序结构设计1、小写字母转换成大写字母DATA SEGMENT D1 DB 255 DUP(0) DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE STAR:MOV AX,DATA MOV DS,AX MOV BX,OFFSET D1 XOR SI,SI LL:MOV AH,1 INT 21H CMP AL,41HJA SHOWSUB AL,20H LOAD:MOV [BX+SI],AL INC SI JMP LLSHOW:MOV BYTE PTR[BX+SI],'$'MOV DL,0AH MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H MOV DX,BX MOV AH,9JB SHOWCMP AL,5AH JBE LOAD CMP AL,61HINT 21HMOV AH,4CH INT 21H CODE ENDS END STARJB SHOWCMP AL,7AH 实验四循环程序结构设计2、无符号由小到大排序 DATA SEGMENT D1 DW , …… DW ,…… N DB ($-D1)/2 D2 DB 6 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA STAR:MOV AX,DATA MOV DS,AX MOV BX,OFFSET D1 MOV DL,N MOV DH,0 DEC DX LL2:MOV CX,DX MOV SI,2 LL1:MOV AX,[BX] CMP AX,[BX+SI] JA LL MOV DI,[BX+SI] MOV [BX+SI],AX MOV [BX],DI 实验四 循环程序结构设计 2、无符号由小到大排序 DATA SEGMENT D1 DW , …… DW , …… N DB ($-D1)/2 D2 DB 6 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA STAR:MOV AX,DATA MOV DS,AX MOV BX,OFFSET D1 MOV DL,N MOV DH,0 DEC DX LL2:MOV CX,DX MOV SI,2 LL1:MOV AX,[BX] CMP AX,[BX+SI] JA LL MOV DI,[BX+SI] MOV [BX+SI],AX MOV [BX],DILL:ADD SI,2 DEC CX JNZ LL1 ADD BX,2 DEC DX JNZ LL2 LEA BX,D1 MOV CH,0 MOV CL,N LP:CALL SHOW DEC CX JZ EXIT ADD BX,2 JMP LP EXIT:MOV AH,4CH INT 21H SHOW PROC XOR DL,DL MOV AX,[BX] LA:CMP AX,10000 JB LA1 SUB AX,10000 INC DL JMP LA LA1:OR MOV XOR LB:CMP JB SUB INC JMP LB1:OR MOV MOV LC:CMP JB SUB INC JMP LC1:OR MOV MOV LD:CMP JB SUB INC JMPDL,30H D2,DL DL,DL AX,1000 LB1 AX,1000 DL LB DL,30H D2+1,DL DL,0 AX,100 LC1 AX,100 DL LC DL,30H D2+2,DL DL,0 AX,10 LD1 AX,10 DL LDLD1: OR DL,30H MOV D2+3,DL OR AL,30H MOV D2+4,AL MOV D2+5,'$' LEA DX,D2 MOV AH,9 INT 21H MOV DL,';' MOV AH,2 INT 21H RET SHOW ENDP CODE ENDS END STAR
更多搜索:
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 微机原理与汇编语言 的文章

 

随机推荐