实验二8086汇编语言之分支、循环程序设计
汇编语言-实验二 循环与子程序程序设计2023简版

汇编语言-实验二循环与子程序程序设计汇编语言-实验二循环与子程序程序设计引言在汇编语言中,循环与子程序是常用的程序设计技术。
循环结构能够使程序重复执行一段代码,而子程序则能够将一段代码封装成一个可重用的模块。
本文将介绍如何使用汇编语言进行循环和子程序的程序设计。
循环结构在汇编语言中,循环结构可以使用`LOOP`指令或者`JMP`指令来实现。
`LOOP`指令会根据`CX`寄存器的值进行循环,每次循环都会将`CX`寄存器的值减一。
程序员可以通过设置`CX`寄存器的初始值来控制循环次数。
下面是一个简单的示例演示如何使用`LOOP`指令实现循环结构:asmMOV CX, 5 ; 设置循环次数为5L1:; 这里是循环体的代码LOOP L1 ; 循环除了`LOOP`指令,我们还可以使用`JMP`指令来实现循环结构。
`JMP`指令会无条件地跳转到指定的标签处,从而实现循环。
在循环体的末尾,程序员需要通过`JMP`指令将控制流程跳转到循环的开始处。
下面是一个使用`JMP`指令实现循环结构的示例:asmMOV CX, 5 ; 设置循环次数为5L1:; 这里是循环体的代码DEC CX ; 循环次数减一JNZ L1 ; 如果循环次数非零,跳转到L1处子程序子程序是一段独立的代码块,可以在程序中被多次调用。
通过使用子程序,可以将重复的代码封装为一个可重用的模块,提高程序的可维护性和可读性。
在汇编语言中,子程序的定义和调用可以使用`PROC`和`CALL`指令来实现。
`PROC`指令定义一个子程序,而`CALL`指令用于调用一个子程序。
在子程序内部,使用`RET`指令返回到调用它的地方。
下面是一个简单的示例演示如何定义和调用一个子程序:asmPROC MySubroutine; 这里是子程序的代码RET ; 返回ENDPCALL MySubroutine ; 调用子程序在子程序内部,可以使用栈来传递参数和保存返回地质。
例如,可以使用`PUSH`指令将参数压入栈中,然后在子程序内部使用`POP`指令来取出参数值。
汇编实验2-循环程序设计-实验报告

汇编实验2-循环程序设计-实验报告一、实验目的1、了解循环程序设计的方法2、理解汇编语言中循环指令的使用3、掌握汇编语言中常用的循环结构二、实验原理1、循环指令循环指令是计算机中常用的一种控制结构,其作用是重复执行一定的操作。
在汇编语言中,常用的循环指令有LOOP、LOOPE、LOOPNE等,具体功能如下:(1)LOOP:重复执行指定次数的操作;(2)LOOPE:执行操作直到CX寄存器为0或ZF寄存器为1;(3)LOOPNE:执行操作直到CX寄存器为0或ZF寄存器为0。
LOOP指令的语法格式如下:LOOP label其中,label表示循环的目标地址。
2、循环结构循环结构是计算机程序设计中常用的一种结构,其基本形式包括:while、do...while、for等。
在汇编语言中,常用的循环结构有以下两种:(1)无限循环结构:该结构适用于需要不停顿地进行某项操作的情况,底层逻辑基于测试指令;(2)计数器循环结构:该结构适用于需要循环指定次数的情况,底层逻辑基于循环指令。
三、实验内容1、使用循环指令实现计算1~10的和;2、使用循环结构实现计算1~10的和。
四、实验步骤1、使用循环指令实现计算1~10的和。
(1)将计数器初始化为10,即MOV CX,10;(2)将累加器初始化为0,即MOV AX,0;(3)将当前计数器值加到累加器中,即ADD AX,CX;(4)将计数器减1,即DEC CX;(5)判断计数器是否为0,若不为0,则执行第3步;若为0,则跳转到计算结果的部分。
2、使用循环结构实现计算1~10的和。
(1)将计数器初始化为10,即MOV CX,10;(2)将累加器初始化为0,即MOV AX,0;(3)将当前计数器值加到累加器中,即ADD AX,CX;(4)将计数器减1,即DEC CX;(5)判断计数器是否为0,若不为0,则执行第3步;若为0,则跳转到计算结果的部分。
五、实验结果(1)使用循环指令实现计算1~10的和MOV CX,10MOV AX,0LOOP label1ADD AX,CXDEC CXJNZ label1label1:MOV sum,AX(2)使用循环结构实现计算1~10的和MOV CX,10MOV AX,0label2:ADD AX,CXDEC CXJNZ label2MOV sum,AX六、实验总结本次实验实现了两种不同的循环方式,分别使用了循环指令和循环结构。
8086汇编语言循环程序设计.

⑴ 用子程序方法编程: DATA SEGMENT HEXDATA DW 4D7EH RESULT DB 4 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE;DS:DATA START: MOV AX, DATA MOV DS, AX MOV CX, 4 LEA SI, HEXDATA LEA DI, RESULT MOV BX, [SI] NEXT: MOV AX, BX AND AL, 0FH CALL HEXASC MOV [DI], AL INC DI PUSH CX MOV CX, 4 SHR BX, CL POP CX LOOP NEXT
程序的流程图如下所示。
开始 初始化 AX←0, CX←0, BX←0 BX←BX+1 AX←AX+BX, CX←CX+1
Y
AX≤1000?
N
n←CX, sum←AX
结束
程序编写如下: DATAS SEGMENT n DW ? sum DW ? DATAS ENDS STACK SEGMENT PARA STACK ’stack’ DW DUP(?) STACK ENDS CODES SEGMENT MAIN PROC FAR ASSUME CX:CODES, DS:DATAS, SS:STACK START: PUSH DS MOV AX, 0 PUSH AX MOV AX, DATAS MOV DS, AX
4.子程序的嵌套与递归调用 一个子程序调用另一个子程序叫子程序嵌套,如下 图所示:
CALL
CALL
CALL
RET
RET
RET
主程序
子程序1
子程序2
子程序n
由于调用子程序时,断点地址保存在堆栈中,因此只 要有足够的堆栈空间,嵌套的层次(也称深度)是不 受限制的。 若一个子程序调用该子程序自身,则称为递归调 用。递归调用是子程序嵌套的特例。 5. 子程序调用和伪指令使用的例子 [例7] AX寄存器中存放着4位十六进制数,是编 写程序将这4位十六进制数分别转换为相应的ASCII码, 并依次存放到RESULT数组的4个字节中去,要求分别 用子程序和伪指令的方法实现。
汇编语言设计 教案 第五章 循环与分支程序设计

5.1.2 循环程序设计方法
无论使用哪种循环结构,循环程序一般应包括 以下几部分: ➢ 循环初始化。它包括设置循环次数的初始值、地址 指针的初始设置等。 ➢ 循环体。这是循环工作的主体,包括要重复执行的 操作,以及循环的修改部分。修改部分包括地址指 针的修改、循环控制条件的修改等。 ➢ 循环控制部分。它是控制循环的关键,判断循环条 件满足与否。
特别要注意循环入口和循环次数的正确设置、 地址指针及循环控制条件的修改等。否则会得不到 期望的结果。
DATA
ENDS
这是一个初始循环次数不定、根据条件控制循环的例子
算法:先使用字符串指令进行块 查找,若找到则显示“Duplication!
MOV DX,0
例5.1 试编 MOV CL,10
分析:采用折半查找法可以提高对有序表的查表效率。
JMP SHORT EXIT
制一个程序, MOV BX,TAB[SI] ;元素前移为插入的数字腾位置 MOV TAB[SI-2],BX
ADD SI,2
;修改地址指针
把BX寄存 JMP SHORT COMPARE
A: MOV AH,9H
LEA DX,PRT
器中的二进 INT 21H
JMP EXIT
B: MOV TAB[SI-2],AX ;插入元素
CN
DW ($-BUFFER)/2 ;元素个数
MAX
DW ?
;存放最大数单元MINDW ?;存放最小数单元
汇编语言程序设计实验报告二(分支循环程序实验)

汇编语言程序设计实验报告二(分支循环程序实验)一、实验目的1、掌握分支程序、循环程序的设计方法。
2、熟悉DEBUG程序的使用方法。
3、掌握汇编语言程序的编辑、汇编、连接以及调试过程。
二、实验内容1、编写一程序,将内存中某一区域的数据传送到另一个区域中(要求用循结构,不考虑数据块重叠问题)。
2、编写一程序,将内存中某一区域的数据传送到另一区域(要求考虑数据块重叠问题)。
三、实验准备1、预习数据传送指令,熟悉分支和循环程序设计方法。
2、预习DEBUG调试程序的使用方法。
3、根据实验内容要求,编写好实验源程序。
四、实验步骤1、用QE或其它编辑软件,在计算机上编辑源程序,使其正确无误。
2、汇编、连接源程序,产生.EXE可执行文件。
3、运行程序。
(1) 进入DEBUG。
打入DEBUGT MYPROG.EXE。
MYPROG为所编程序的文件名。
(2) 先用G命令连续剧连续执行程序,程序执行完毕后,观察运行结果。
如果执行后是对的,说明程序编写是正确的,如果结果不对,说明程序有错误,则执行下一步。
(3) 检查程序。
在程序中设置若干断点,以便杳出错误所在。
(4) 采用单步命令T或执行程序,观察各寄存器和存储单元内容,以便找到错误之处。
五、实验报告要求1、列出程序清单,并给出程序流程图。
2、总结实现数据传送的几种方法,指出它们的区别。
开始3、分析实验中所遇到的一些问题,分析错误原因。
4、说明本实验中是如何使用DEBUG进行调试的。
CX、SI、DI置初值六、流程图勤开始设置增量方式CX、SI、DI置初值保存SI内容AL [SI] SI SI+源块长度[DI] AL N SI>DIYSI SI+1 恢复SI内容恢复SI内容DI DI+1CX CX-1 设置减量方式N CX=0, SI指向源块末尾DI指向目的块末尾Y结束 [DI] [SI]题一流程图 N 传完了吗, 书馆 Y结束题二流程图七、程序清单题一程序清单:STACK SEGMENT STACK ‘STACK’DB 100 DUP(0)STACK ENDSDATA SEGMENT PARA ‘DATA’SOUR DB 0、1、2、3、4、5、6、7、8、9 DEST DB 10 DUP(,)DB ‘$’DATA ENDSSEGMENT PARA‘CODE’ASSUME CS:CODEMAIN PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV CX,10MOV SI,offset SOURMOV DI, offset DESTAGAIN: MOV AL,[SI]MOV [DI],ALINC SIIN DILOOP AGAINMOV DX,offset DESTMOV AH,09HINT 21HRETMAIN ENDPCODE ENDSEND START题二程序清单:DATA SEGMENT PARA ‘DATA’STRG DB ‘ABCDEFGHIJKLMNOP’STG1 EQU STRG+4STG2 EQU STHG+8STRSE EQU 6DATA ENDSSTACK SEGMENT PARA ‘CODE’DB 100 DUP(0) STACK ENDSCODE SEGMENT PARA ‘CODE’ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV CX,STRSEMOV SI,OFFSET STG1MOV DI,OFFSET STG2CLDPUSH SIADD SI,STRSE-1CMP SI,DIPOP SIJL MOVESTDADD SI,STRSE-1ADD DI,STRSE-1 MOVE: REP MOVSB RETMAIN ENDPCODE ENDSEND START。
80X86汇编语言电子教案(5-循环与分支程序设计)

一汇编语言程序设计基本步骤二程序的基本结构形式顺序结构的程序执行时按语句的书写顺序依次执行转移分支和循环因此对于有先后关系的语句程序设计时其先后次序是至关重要的顺序结构一般为简单程序顺序片段会在所有程序中存在1X和位无符号数16X Y值的程序分析1如何定义数据段X Y运算结果用双字空间存储2如何实现无符号数乘法1用加法指令实现无符号数乘法23解12CSEG SEGMENT1设位无符号数写一个求表达式16X Y值的程序实现无符号数乘法1设位无符号数写一个求表达式16X Y值的程序思考是有符号数1数据段的定义是否需要改变2对于这三种指令号数乘法的实现有何不同循环是一种重复循环通常由四部分组成1初始化部分234常有两种1Do-Until由循环指令实现2由转移指令实现说明(1) 由循环指令实现循环时ECX ZF标志这时计数值调整和条件测试在循环指令中完成例如使用LOOP LOOPZ/LOOPNZ 由转移指令实现循环时通常以条件转移指令为循环控制部入口以无条件转移指令为循环体结束件控制法循环可以嵌套明确循环控制部分和调整部分防止死循环特殊循环结构在循环体内条件判断出口能有多个出口循环控制部分控制循环何时结束1循环次数已知例LOOP2循环次数已知但可能提前结束例LOOPZ/LOOPNZ3循环次数不定据具体情况而定合理选择循环控制条件是循环程序设计的关键题意屏幕显示如下2把制的形式显示在屏幕上2把制的形式显示在屏幕上分析位十六进制数码因此BX位之后加上一个数一个十六进制数码对应字母的码值算法的基本思想ASCII A~F2把制的形式显示在屏幕上程序主体rotate: 完成什么功能;0-9ASCII 30H-39H作用 ;A-F ASCII 41H-46H作用3 53将正数数组的正确位置数据段部分3 5353535算法的基本思想ARRAY_HEAD-2-1K NN循环次数已知但可能提前结束代码段部分1数组中元素与插入值的比较指令在何处2控制循环结束的指令在哪里3边界条件如何体现功能3将正数数组的正确位置4试编制一程序从键盘输入一行字符要求第一个键入的字符必须是空格如不是则退出是则开始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区中空格符不存入直到接收到第二个空格符时退出程序题意C空格是第一个字符是空格符是空格符代码段部分LEA BXMOV FLAG0NEXT MOV AH01HINT21HFLAG01HFOLLOWALEXITFLAG1 FOLLOWCMP ALEXIT[BX]EXIT 1判定第一个接收字符的指令语句在哪里2循环结束条件是什么循环结构思路采用冒泡排序算法使用双重循环内层循环每次比较相邻的两个数据次序不对则交换外层循环控制内层循环次数以及负责内层循环的初始化5将首地址为字的数组从大到小实现排序多重循环21循环可以嵌套多重循环的设计方法同单重循环但应分别考虑各重循环控制条件数据段部分代码段部分CX 内层循环计数器也CX 该程序如何解决它们冲突的循环结束条件是否可以更改作业P175。
汇编-循环与分支程序设计

方法A
MOV DL,0DH MOV AH,06H INT 21H MOV DL,0AH MOV AH,06H INT 21H
方法B
MOV DL,0AH MOV AH,06H INT 21H MOV DL,0DH MOV AH,06H INT 21H
记住以下ASCII值
退格:08H(即8) 空格:20H(即32) 换行:0AH(即10) 回车:0DH(即13) 0 :30H(即48) a :61H(即97) A :41H(即65)
程序流程图
开始
DX=A
DX=A+B BX=DX DX左移3位 BX左移1位
DX=BX+DX-500
结束
编写程序
DATA BUFA BUFB RESULT
SEGMENT DW ? DW ? DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: CODE
➢ 循环控制部分:判断循环条件满足与否,常用方法:计数控制、特 征值控制、地址边界控制等。
➢ 常用指令
[1].LOOP,LOOPZ/LOOPE,LOOPNZ/LOOPNE;
[2].各种跳转指令;
特别要注意循环入口和循环次数的正确设置、地址指针及循环控
制条件的修改等。否则会得不到期望的结果。
➢ 多重循环程序设计循环嵌套
INT 21H
不回显在屏幕上
2.键盘一次输入一个字符串的方法:
串地➢址例存如入(,DS在:D数X)据、调区用定参义数的为字10送符A缓H冲区如下:
MOV MOV MOV MOV MOV
DABADDAXuHSX,f,,,TfASAO0eEXfArGf,Hsc/eSASBo/tBEuu设TCufnGRf置BftTMfueILeNIr/frENE/fGT/设e/NN/r/置BTB/2uu/1存ffBHDffDuD功入eefBBBrrf能字是的er参符存段的33?数串放地偏22 为的输址移D0最入U存地APH大字入址(长符D存S?度串入)并的DX存缓入冲B区uffer的首字节;
8086 汇编语言分支程序设计

汇编语言程序设计实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科131MOV AH,2INT 21H ;显示高位ASCII 码MOV DL,BLAND DL,0FHCMP DL,9JBE NEXT2ADD DL,7NEXT2: ADD DL,30HMOV AH,2INT 21H ;显示低位ASCII 码MOV AH,4CHINT 21HCODE ENDS ;返回DOSEND START使用相应的文本编辑器建立文件three.asm,内容如上所示。
2.生成可执行文件:1>.汇编:C:\masm> masm three;2>.连接:C:\masm> link three;3.运行及调试:1>. 运行:C:\masm>debug three.exe-U0 ;通过反汇编查找程序的断点-T=0 2 ;加载数据段-D0 ;查看原始数据是否正确-G=0 XX ;运行程序至断点XX 处-R ;查看程序运行结果以上命令执行的细节可参照实验二中的说明。
4.调试:修改AL 的内容,判断此程序是否能正确显示其中的内容的方法。
例:修改AL 内容为9AH:-L ;重新加载可执行文件-A0 ;重新修改MOV AL,3EH 指令361E:0000 MOV AL,9A361E:0002-G=0 xx;带断点运行-R ;查看程序运行结果实验二:编写一个数据区移动程序,要考虑源数据区与目的数据区有重叠的情况。
1.源程序如下所示,编辑下面的源程序到文件lab.asm 中:使用相应的文本编辑器建立文件lab.asm,内容如上所示。
2.生成可执行文件:1>.汇编:C:\masm> masm lab;2>.连接:C:\masm> link lab;N1:INC NUMBERJMP NUMBERJMP AGAINN2:INC CHARJMP AGAINEXIT:LEA DX,STR1MOV AH,09HINT 21HMOV DL,NUMBERADD DL,30HMOV AH,2INT 21HLEA DX,STR2MOV AH,09HINT 21HMOV DL,CHARADD DL,30HMOV AH,2INT 21HLEA DX,STR3MOV AH,09HINT 21HMOV DL,RESTADD DL,30HMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START使用相应的文本编辑器建立文件lab1.asm,内容如上所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二8086汇编语言之分支、循环程序设计
【实验目的】
1.掌握循环结构程序设计的方法;
2.掌握数据块传送程序设计的方法;
3.掌握串传送指令的应用。
【实验内容】
1.编写程序实现将数据段STR1单元开始的20个字符移到STR2开始的存储区。
假设STRI+20>STR2,可以用串传送指令,也可以用MOV传送指令。
该题目要求掌握单循环程序设计方法。
为了实现指定功能,应从以下几个方面考虑:
(1)数据串操作的起始位置从高地址还是从低地址开始。
(2)确定使用串传送指令,还是用MOV指令。
(3)确定循环程序的结构。
2.如果要求字符串从键盘中输入,应如何设计程序?
3.用子程序方法,且不使用MOVSB指令来完成数据块的传输,应如何设计程序?【实验程序】
DATA SEGMENT
STR1 DB 'WHAT IS YOUR NAME?',0AH,0DH,'$'
CN EQU $-STR1
STR2 EQU STR1+ CN-5
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE,ES:DATA
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV DX, OFFSET STR1
MOV AH,09H
INT 21H
MOV SI ,OFFSET STR1
MOV DI ,OFFSET STR2
MOV CX ,CN
ADD SI ,CN-1
ADD DI, CN-1
STD
REP MOVSB
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
【实验结果】
数据段STR1单元开始的20个字符成功移到STR2开始的存储区
【实验心得和体会】
通过实验让我掌握了循环结构程序设计的方法、数据块传送程序设计的方法、串传送指令的应用。
更好地了解了语言之分支、循环程序设计让我知道汇编程序的奥秘,我对x86的指令有了新的认识,对一些指令操作更熟练啦。