实验六 汇编语言中的循环程序设计

合集下载

汇编语言循环程序实验报告

汇编语言循环程序实验报告

一、实验目的(1) 加深对循环结构的理解;(2) 掌握循环程序的设计方法;(3) 熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。

二、实验内容1.已知以BUF为首地址的字存储区中存放着8个有符号二进制数,是编写程序将其中大于等于0的数依次送BUF1为首地址的字存储区中,小于0的数依次送以BUF2为首地址的字存储区中。

同时将大于等于0的数的个数送A字变量,将小于0数的个数送B字变量。

2.设STR字符串是以0结尾。

试编写一个把字符串中的所有大写字母改为小写字母的程序并将转换后的字符串显示输出。

3.试编程从自然数1开始累加,直到累加和大于5050为止,统计被累加的自然数的个数,并把统计的个数送入COUNT单元,累加和送入TOTAL单元。

三、算法描述流程图实验内容1、2、3的流程图分别为图1、图2、图3。

图1 图2 图3四、实验步骤1.已知以BUF为首地址的字存储区中存放着8个有符号二进制数,是编写程序将其中大于等于0的数依次送BUF1为首地址的字存储区中,小于0的数依次送以BUF2为首地址的字存储区中。

同时将大于等于0的数的个数送A字变量,将小于0数的个数送B字变量。

1)输入源程序:DATA SEGMENTBUF DW 23,123,-12,-210,45,0,90,-453BUF1 DW 8 DUP(0)BUF2 DW 8 DUP(0)A DW ?B DW ?DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART: MOV AX, DATAMOV DS, AXLEA BX, BUFLEA SI, BUF1LEA DI, BUF2MOV A,0MOV B,0MOV CX,8L0: MOV AX,[BX]CMP AX,0JGE L1MOV [DI],AXADD DI,2INC BJMP NEXTL1: MOV [SI],AXADD SI,2INC ANEXT: ADD BX,2LOOP L0MOV AH, 4CHINT 21HCODE ENDSEND START2)运行程序。

汇编程序设计 分支与循环混合结构程序设计 实验报告

汇编程序设计 分支与循环混合结构程序设计 实验报告
1
《汇编语言程序设计》
实验报告
实验六 分支与循环混合结构程序设计
2
实验目的
1、掌握利用.IF语句实现分支程序的设计方法; 2、掌握利用.REPEAT语句实现循环程序的设计方法; 3、掌握DIV指令的使用特点; 4、掌握地址表的定义和使用方法。
实验内容
实现成绩单的分等级统计功能,在数据段中有成绩单的定义,并包含有若干个分数,程 序根据成绩单数据的个数循环分别统计个分数段成绩的个数,最后输出个等级段的分数个数。 要求:成绩单数据少于100字节,输出的每个档次统计值按两位数显示。
scoreo db 10,13,'Score "Other" count is:$'
table dw scoreo,scoree,scored,scorec,scoreb,scorea ;定nt
mov si,0
begin:
;统计各个分数段的成绩个数
图 6-3 运行程序输出结果察看
3、修改成绩单的内容再重新汇编和运行程序,观察程序的结果变化情况。
5
图 6-4 修改成绩单后,运行程序输出结果察看
4、利用DEBUG工具的U命令反汇编可执行程序,观察.IF语句及.REPEAT语句所对应的汇编指 令情况。
6
图 6-5 利用DEBUG工具的U命令反汇编可执行程序并观察
实验体会
1. 分支伪指令的具体格式如下:
图 6-8 分支伪指令格式 2. REPEAT 型循环伪指令:
REPEAT 型循环在执行完循环体后,才判定逻辑表达式 condition 的值。若该 表达式的值为真,则终止该循环,并将执行伪指令.UNTIL[CXZ]后面的指令,否 则,将向上跳转到伪指令.REPEAT 之后的指令,为继续执行其循环体作准备。

(实验六)汇编语言课内实验报告

(实验六)汇编语言课内实验报告

实验四循环结构程序设计上机实验
一、实验目的:
1、掌握循环结构程序设计的基本方法。

2、掌握用masm for Windows编辑、编译、连接汇编语言源程序的基本方法。

3、掌握DEBUG调试程序的U、D、R、T、G、Q常用命令的用法。

二、实验步骤:
1、用ASM masm for Windows将源程序输入,其扩展名为.ASM。

2、用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。

若汇编时提示有错,则修改源程序后重新汇编,直至通过。

3、用LINK将.OBJ文件连接成可执行的.EXE文件。

4、用DEBUG调试程序并分析结果。

三、实验内容:
1. 在数据段中从变量DA1开始有N个带符号数。

把其中的正数、负数(设没有0)依次存入DA2、DA3开始的单元中并分别统计正、负数的个数存入DA4、DA5字节单元之中。

试编写程序。

将本例中的DEC指令修改为LOOP指令来实现循环程序的设计。

在修改过程中还应修改哪能些指令,请自己分析,为什么?
四、综合练习:
1.编写求100个正整数的和的程序。

如果和不超过16位字的范围(即65535),则将其和保存到WORDSUM单元中,若超过则显示OVERFLOW。

2.设有N个数,连续存放在以BUF为首址的字存储区中,试编写程序,统计其中最高的6位全1的数个数并将统计结果送入寄存器DX中。

五、实验报告(注意:将报告正反两面打印后用手写)附件如下:
实验四循环程序设计实验报告学号姓名成绩。

汇编实验六循环程序是设计说明

汇编实验六循环程序是设计说明

实验报告──学年第学期实验课程汇编语言学生姓名123实验项目循环程序是设计学院计算机科学技术实验性质专业选修课班级学号实验地点同组人数 1 第组实验日期第周星期第节 4成绩环境参数一、实验目的及要求二、实验原理、实验容三、实验仪器设备及资料四、操作方法与实验步骤五、实验数据记录及办理六、实验结果剖析及议论一、实验目的 :1.灵便运用各样许循环指令,掌握循环程序的设计方法2.学会针对不同样样的问题,采纳不同样样的组织循环的方法。

3 .伪指令EQU及操作符'$' 的使用。

4 . COM 文件的要求和生成过程。

二、实验任务1 .编写程序:将一个包含有20 个有符号数据的数组arrayM分成两个数组,正数数组arrayP和负数数组 arrayN,并分别把两个数组中的数据个数显示出来源代码:;十一个正数九个负数DATA SEGMENTarrayM DB 1,-1,2,-2,3,-3,4,-4,5,-5,6,-6,7,-7,8,-8,9,-9,0,10 arrayP DB 20 DUP(?)arrayN DB 20 DUP(?)countP DB 0DATA ENDSCODE SEGMENTassume CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA BX,arrayMMOV SI,0 ; 数组 arrayP 偏移地址MOV DI,0 ; 数组 arrayN 偏移地址MOV CX,20 ;循环 20 次LOP:MOV AL,[BX]CMP AL,0 ; 与0 比较JL toN ; 小于0MOV arrayP[SI],AL ; 大于等于0INC SIINC countPJMP AGAIN ; 转去办理循环toN: MOV arrayN[DI],AL ; 负数存入arrayN 数组INC DIAGAIN: INC BX; 相当于 for 语句的第三部分LOOP LOPDISP_A:;显示功能,因为最多只有两位数,使用一次除法即可AND AH,0;商为十位,余数为个位MOV AL,countPCALL DISP_BMOV AH,02HMOV DL,20HINT 21HAND AH,0MOV AL,20DSUB AL,countPCALL DISP_BMOV AX,4C00HINT 21HDISP_B:MOV CL,10DDIV CLMOV DH,AHCMP AL,0JZ DISP_CMOV DL,AL;商为 0 时,跳过不执行ADD DL,30HMOV AH,02HINT 21HDISP_C:MOV DL,DHADD DL,30HMOV AH,02HINT 21HRETCODE ENDSEND START 流程图:仪器设备损坏、非正常耗费费料(试剂)及办理情况:无教师对报告的最后议论及办理建议:教师签字:年月日。

汇编-循环与分支程序设计

汇编-循环与分支程序设计

汇编-循环与分支程序设计汇编-循环与分支程序设计1.引言在汇编语言中,循环与分支是非常重要的程序设计概念。

循环用于重复执行一段代码,而分支用于根据条件来选择不同的代码路径。

本文将详细介绍汇编语言中的循环与分支程序设计。

2.循环程序设计2.1 for 循环在汇编语言中,for 循环可以通过计数器和条件判断来实现。

以下是一个示例代码:________mov ecx, 10 。

设置计数器初始值为 10mov eax, 0 。

设置累加器初始值为 0for_loop:________add eax, ecx 。

累加计数器的值到累加器loop for_loop 。

循环,直到计数器为 0在上述示例代码中,循环的条件是计数器 ecx 的值非零。

每次循环时,累加器 eax 会将计数器的值累加到自身,然后计数器会自动减一,直到计数器为 0,循环结束。

2.2 while 循环在汇编语言中,while 循环可以通过条件判断来实现。

以下是一个示例代码:________mov eax, 0 。

设置累加器初始值为 0while_loop:________cmp eax, 10 。

比较累加器的值和 10jge end_while 。

如果累加器的值大于等于 10,跳出循环add eax, 1 。

累加器加 1jmp while_loop 。

跳到 while_loop 标签,继续循环end_while:________在上述示例代码中,循环的条件是累加器 eax 的值小于 10。

每次循环时,累加器会加 1,然后再进行条件判断,如果满足条件继续循环,否则跳出循环。

3.分支程序设计3.1 if-else 语句在汇编语言中,if-else 语句可以通过条件判断来实现。

以下是一个示例代码:________mov eax, 10 。

设置变量的初始值为 10cmp eax, 5 。

比较变量的值和 5jg greater 。

如果变量的值大于 5,跳转到greater 标签less:________。

汇编语言设计-循环程序

汇编语言设计-循环程序
子程序与主程序之间的参数传递通常有以下几种方法: ①、寄存器传递。由CPU的内部寄存器作为传递的媒介, 完成数据或结果的传递。适合参数较少的情况。
②、参数表传送。主程序在调用子程序之前, 应事先建 立一个参数表。参数表可建在内存或外设端口中, 由子程 序按规则去存取。它适合于参数较多的情况。
③、堆栈传送。主程序和子程序在同一堆栈中存放数据 或结果, 根据参数存取的需要, 调节出入栈顺序, 达到传递 参数的目的。其中主程序将参数压入堆栈, 子程序将参数 从堆栈中弹出。它适合于参数多且子程序有嵌套或递归调 用的场合。
思考:若数据块长度为100个字节,遇回车符停止清0,否则 全部清0,程序应如何编写?
4、多重循环
多重循环又称循环嵌套 , 即循环套循环。使用时, 应注 意以下几点:
①、内循环必须完整地包含在外循环内,不得互相交叉。
()
()
②、内循环在外循环中的位置,根据需要设置。 ③、内循环在外循环中可以并存、可以从内循环中直接 跳至外循环 , 反之则不行。
①、先将断点(即CALL下一条指令的地址)NEXT进栈, 即保护断点。
②、程序转到DTOB处执行 ,实现转子 ;且利用子程序的
最后一条指令RET ,将堆栈 的内容弹出 ,返回主程序。
⑵、寄存器及其所用工作单元内容的保护
设计子程序时, 除具有通用性外, 还要注意避免子程序无
意破坏主程序的数据的情况, 因此, 应将子程序中用到的寄
四、循环程序设计
1、循环程序的引入
例:计算Y=100ai 设和数为16位数
i=1
置数据区
MOV AX , 0 ;清结果寄存器 MOV BX,OFFSET TABL ;置地址指针
ADD AX , [BX] ;求部分和

汇编实验四分支和循环程序设计实验(设计性实验)

汇编实验四分支和循环程序设计实验(设计性实验)

汇编实验四分支和循环程序设计实验(设计性实验)汇编语言实验报告实验四分支和循环程序设计实验(设计性实验)班级:姓名:学号:实验日期:实验四分支和循环程序设计实验(设计性实验)一、实验要求和目的1.熟悉汇编语言程序设计结构;2.熟悉汇编语言分支程序基本指令的使用方法;3.掌握利用汇编语言实现单分支、双分支、多分支的程序设计方法;4.了解汇编语言循环程序设计的基本流程;5.熟悉汇编语言循环基本指令的使用方法;6.掌握利用汇编语言的循环指令完成循环程序设计方法。

二、软硬件环境1、硬件环境:计算机系统windows;2、软件环境:装有MASM、DEBUG、LINK、等应用程序。

三、实验涉及的主要知识在实际应用中,经常根据一些条件来选择一条分支执行。

汇编语言的条件判断主要是通过状态寄存器中的状态位、无符号数相减或有符号相减而导致的结果来进行。

1.无条件转移指令JMP无条件转移指令JMP 是使程序无条件转移至目标处,又分为段内转移、段间转移。

2.条件转移指令JXX条件转移指令可分为三大类:1).简单条件转移指令指令。

根据单个标志位的状态判断转移条件。

标志位指令转移条件意义CF JC CF=0 有进位/借位JNC CF=1 无进位/借位ZF JE/JZ ZF=1 相等/等于0JNE/JNZ ZF=0 不相等/不等于0 SF JS SF=1 是负数JNS SF=0 是正数OF JO OF=1 有溢出JNO OF=0 无溢出PF JP/JPE PF=1 有偶数个1JNP/JPO PF=0 有奇数个12).无符号数条件转移指令。

假设在条件转移指令前使用比较指令,比较两个无符号数A,B,指令进行的的操作是A-B,其转移指令如下:指令转移条件意义JA/JNBE CF=0 AND ZF=0 A>BJAE/JNB CF=0 OR ZF=1 A>=BJB/JNAE CF=1 AND ZF=0 A<b< p="">JBE/JNA CF=1 OR ZF=1 A<=B3).带符号数条件转移指令。

汇编语言循环程序设计

汇编语言循环程序设计

LEA
MOV STD LOOP1: LODSB MOV MOV INT LOOP MOV MOV INT MOV INT
SI, RESULT+3 CX, 4
DL, AL AH, 02H 21H LOOP1 DL, 'H' AH, 02H 21H AH, 4CH 21H
;十六进制转换成ASCII码子程序
CODE ENDS END START
(2)用条件控制循环
有些情况无法确定循环次数,但是循环何时结束, 可用某种条件来确定。这时,编制程序主要是寻找控制 条件及对控制条件的检测。
[例5] 从自然数1开始累加,直到累加和大于1000 为止,统计被累加的自然数的个数,并把统计的个数送 入n单元,把累加和送入sum单元。
LOOPT: INC BX
ADD AX, BX
INC CX
CMP AX, 1000
JLE LOOPT
MOV n, CX
MOV sum, AX
RET
MAIN ENDP
CODES
ENDS
END START
3.多重循环程序设计
多重循环又称循环嵌套,即循环套循环。有些问题 比较复杂,单重循环难以解决,必须使用多重循环。在使 用多重循环时,必须注意以下几点:
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
MOV CX, 0
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数学与软件科学学院实验报告
学期:2013 至 2014 第二学期 5月 10日
课程名称:汇编语言专业: 信息与计算科学 2011 级 5 班
实验编号:6 实验项目:指导教师:
姓名:学号:实验成绩:
实验六汇编语言中的循环程序设计(4学时)
实验目的:
掌握循环程序设计的基本方法。

主要掌握几种基本的循环程序设计技巧,如
计数法程序设计、当循环、直到循环等程序设计技术。

实验内容:(任选其二)
主要实验实例:
1.用多种循环方法实现1+2+3+…+20的程序(至少二种方法);
2.将寄存器AX中的2#数用16#形式显示出来;
3.将内存中的数据块中(BUFF为起始地址)奇数和偶数分别存入以ADDR1和ADDR2开始的存储块中,并分别统计其中的奇、偶数,将统计结果存放在RESULT开始的两个字存储单元中;
4.不利用乘法指令实现乘法的程序;
5.对在附加段中的首地址为LIST的字数组进行从大到小的排序;
6.对给定数组和给定数,编制程序来确定数组中是否有给定数的值,如有则从数组中删除之;
7.对给定数组和给定数(设数组是有序数组),试将给定数插入给定数组中相应位置。

实验准备:
汇编语言下的循环程序设计基本技术和指令系统。

循环程序设计的基本结构和问题表示方法。

实验步骤:
(1) 完成源程序设计任务,并准备好测试用例,分析其可能的测试结果;
(2) 上机运行和测试所写的程序;
(3) 进行实验分析;
(4) 编写实验报告。

实验结果:
(1) 根据测试目标写出测试报告;
(2) 测试结果分析说明;
(3) 测试程序代码清单。

一>、将寄存器AX中的2#数用16#形式显示出来。

思想:将寄存器中从高向低每四位2#转化为一个16#的ASCII,然后再依次显示出来。

绘制程序流程图如下:
根据流程图编写源代码如下:
prognam segment ;define code segment
main proc far
assume cs:prognam
start:
;set up stack for return
push ds
sub ax,ax
push ax
;*************main part of program*************************
mov ch,4 ;number of rotate times
mov ax,1101101010010111b ;2# number
rotate:
mov cl,4 ;shift 4 bits
rol ax,cl ;left 4 to right
mov bl,al ;turn to bx register to convert
mov si,ax ;save ax's value in si because ah register will be used again when print
and bl,15 ;get low 4 bits
add bl,30h ;covert to ASCII
cmp bl,3ah ;is it>9?
jl print
add bl,7h ;digit is A~F
print:
mov dl,bl
mov ah,2 ;print ASCII
int 21h
mov ax,si ;resume AX's value
dec ch
jnz rotate
ret
main endp
prognam ends
end start
将源程序编译链接后,使用debug跟踪执行,如下所示:
此时AX中的数为输入的二进制数的十六进制表示,CX的高字节和低字节分别存入循环次数和移位数。

再继续跟踪,观察各寄存器的变化:
再单步执行若干次,可以依次显示后三位数值,得到如下的最终显示结果:
二>、对给定数组和给定数(设数组是有序数组),试将给定数插入给定数组中相应位置。

思想:假设原数组以递增的次序排列,逐一读取数组中的数值,然后与定数比较,若小于定数,则此单元后面的数逐个前移一个字(向低地址方向移动),否则把定数插在当前单元之前
根据绘制的程序流程图如下所示:
根据算法编写的源代码如下:
data segment ;define data segment
x dw ? ;allot a space before array's first address
array_head dw 3,5,15,23,37,49,52,65,78,99 ;the number in array
array_end dw 105 ;the last number in array
n dw 32 ;the number which are wait to be inserted
data ends
;*********************************************************
prognam segment
;------------------------------------------------------
main proc far
assume cs:prognam,ds:data
start:
;set up stack for return
push ds
sub ax,ax
push ax
;set DS register to current data segment
mov ax,data
mov ds,ax
;main part of prognam goes here
mov ax,n
mov array_head-2,0fffh ;if N<all number in array,insert it after the space of -1 mov si,0
compare:
cmp array_end[si],ax ;search from tail to head
jle insert
mov bx,array_end[si] ;mov current number to higher address
mov array_end[si+2],bx
sub si,2 ;search the next number in low
jmp short compare
insert:
mov array_end[si],ax
ret ;return to DOS
main endp ;end of main part of program
;-----------------------------------------------------
prognam ends ;end of code segment
;*****************************************************
end start
编译链接后,使用debug跟踪执行,如下所示:
此时DS内存单元中的内容是装入的array中的数值以及待插入的数N:
其中红色方框中的是array中的数,红圈即为N。

再继续跟踪:
经过一次比较后,数组中最末位数后移一个,在DS中查看,内容如下:
经过如上的若干步跟踪后,程序运行结束,在DS查看最终结果,如下:
可以看到,N=32(即20H)成功插入原整序数组。

相关文档
最新文档