实验六 汇编语言中的循环程序设计
- 格式:docx
- 大小:159.23 KB
- 文档页数:8
一、实验目的(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、掌握用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:________。
汇编实验四分支和循环程序设计实验(设计性实验)汇编语言实验报告实验四分支和循环程序设计实验(设计性实验)班级:姓名:学号:实验日期:实验四分支和循环程序设计实验(设计性实验)一、实验要求和目的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).带符号数条件转移指令。
汇编语言实验报告实验名称:循环结构程序设计姓名:________________________学号:_________________班级:_________________一、实验内容1. 用多种循环方法实现1+2+3+…+20的程序(至少二种方法);2. 编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符<CR>其ASCII码为0DH),则结束程序,若为其它字符则不显示,继续等待新的字符输入;(选做)3、编写一个汇编语言程序,要求将BX寄存器内的小写字母用大写字母显示出来。
4、A DDRI元是存放数据的内存单元,要求将该内存单元中的字依次用十六进制数显示出来。
二、实验目的1. 掌握循环程序的结构。
2. 掌握循环程序的设计、编写及调试方法。
3. 掌握循环程序设计的基本方法。
主要掌握几种基本的循环程序设计技巧,如计数法程序设计、当循环、直到循环等程序设计技术。
三、实验结果1、将内存中的数据块中(BUFF为起始地址)奇数和偶数分别存入以ADDR和ADDR开始的存储块中,并分别统计其中的奇、偶数,将统计结果存放在RESULT 开始的两个字存储单元中。
实验代码:(1.ASM 1.OBJ 1.EXE)data segme ntbuff dw 6,35,99,17,80,69,50,33addr1 dw 8 dup⑺addr2 dw 8 dup(?)result dw 0,0data endscode segme ntassume cs:code,ds:datastart:mov ax,datamov ds,axmov cx,8dmov si,0mov di,0mov bx,0mov dx,0L1:test buff[si],0001hje L2mov ax,buff[si]mov addr2[bx],axadd si,2add bx,2inc dldec cxjmp L1L2:mov ax,buff[si]mov addr1[di],axadd di,2add si,2inc dhdec cxjmp L1mov si,0mov byte ptr result[si],dhadd si,2mov byte ptr result[si],dl code endsend start运行结果如下:代码如下:(2. ASM 2.0BJ 2.EXE) data segme nt x dw 30dy dw 10ddata endscode segme ntassume cs:code,ds:datastart:push dssub ax,axpush axmov ax,datamov ds,axmov cx,xmov bx,ymov ax,0L1:add ax,bxloop L1mov dx,axmov ah,2int 21h3、用多种循环方法实现1+2+3+…+20的程序(至少二种方法)代码 1:( 31.ASM 31.0BJ 31.EXE)DATA SEGMENTX DW 0D Y DW 20D DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:PUSH DS SUB AX,AX PUSH AXMOV AX,DATA MOV DS,AX MOV BX,X MOV CX,Y MOV AX,0 L1:INC BX ADD AX,BX LOOP L1 MOV DX,AX MOV AH,2 INT 21H CODE ENDSEND START运行结果1如下:(结果存于DX 寄存器中)code ends end start运行结果如下:实验代码 2 如下:(32.ASM 32.OBJ 32.EXE)DATA SEGMENTY DW 20D DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:PUSH DS SUB AX,AX PUSH AXMOV AX,DATA MOV DS,AX MOV CX,Y MOV AX,0 MOV BX,0 L1:INC BX ADD AX,BX CMP BX,20 JNZ L1MOV DX,AX MOV AH,2 INT 21H CODE ENDSEND START运行结果2如下:(实验结果存于DX 寄存器中)4、编写一个程序,判别键盘上输入的字符;若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符<CR>其ASCII码为ODH),则结束程序, 若为其它字符则不显示,继续等待新的字符输入实验代码如下:(4.ASM 4.0BJ 4.EXE)code segme ntassume cs:codestart:mov ah,1int 21hcmp al,Odhje exitcmp al,'0'jb startcmp al,'9'jbe output1cmp al,'A'jb startcmp al,'Z'jbe outputcmp al,'a'jb startcmp al,'z'jbe outputoutput1: mov dl,almov ah,2int 21hjmp startoutput:mov ah,02hmov dl,'c'int 21hexit: mov ah,4chint 21hcode endsend start运行结果如下:5、编写一个汇编语言程序,要求将BX寄存器内的小写字母用大写字母显示出来。
一、实验目的与要求1、掌握汇编程序由编辑、编译、链接到调试的过程。
2、通过汇编调试工具加深对机器指令执行过程的掌握二、实验流程图 开始结束CX=100,AX=0AX+CX->AXCX-1->CXCX=0?AX->RESULT 输出RESULT是否三、程序分析3.1、程序功能利用程序完成求1-100的累加和,结果送到RESULT 单元中,计数控制法3.2 程序分析(1)、循环执行L 标号处的指令,用于计算1-100的累加和,放入RESULT 内存单元 中mov cx, 100lea di, RESULTL:adc [di],cxloop l(2)、先将DX中的数据清零,然后将AX中的数据的各位分解出来,并转换成其相应的ASCII码数值压栈保存,然后用CX统计入栈的次数mov ax,RESULTmov cx,0MOV BX,10JYB1: XOR DX,DXDIV BXADD DL,30HPUSH DXinc cxcmp ax,0jnz JYB1(3)、将之前压栈的数据已先进后出的方式进行出栈,将数据放入DX中,利用INT 21H软中断调用将数据输出到控制台,用CX来控制需要出栈的次数JYB2: POP DXMOV AH,2INT 21HLOOP JYB2mov dl,'D' ;输出'D'mov ah,2int 21h四、实验数据和结果分析4.1实验结果:4.2结果分析:(1)、由程序可知求1到100的和,程序利用CX的值,进行累加,因为CX的初值为100,利用loop指令(CX自动减一),对标号指令进行循环,循环结束(cx=0)即为累加和放入AL中。
(2)、输出:利用分解累积和,每次分解进栈保存,每进栈一次CX++,当分解完毕后,用CX来控制出栈的次数,知道CX=0出栈结束,则累加和输出完毕。
五、实验问题分析、思考题与小结5.1 实验过程出现的问题(1)、怎样输出累加和问题此程序是利用分解累积和,每次分解进栈保存,利用栈的先进后出的功能进行输出,从而实现了累加和的输出5.2 总结通过本次实验,掌握了汇编程序由编辑、编译、链接到调试的过程,通过汇编调试工具加深对机器指令执行过程的掌握,学会了怎样将十进制数输出到控制台。
实验六循环程序设计二实验类型:验证性实验目的:1、掌握多重循环程序的设计方法2、掌握多重循环程序的控制控制条件和退出条件的设计方法。
实验步骤:1、进入DOS环境2、输入命令:path c:\windows\command;c:\turbo\masm保证实验过程中使用的所有命令都在当前路径直接调用3、启动EDIT编辑器输入程序代码4、检查语法错误,如无错误以ASM为后缀名保存文件(如文件名chen.asm)5、运行命令MASM CHEN.ASM生成OBJ文件6、如果出错请回到第3步再纠正错误7、运行命令LINK CHEN.OBJ(此时提示没有堆栈错误请忽略)生成EXE文件8、运行DEBUG调入可执行程序DEBUG CHEN.EXE(以下DEBUG 命令请参看第一次实验内容)9、执行反汇编U10、查看程序结束地址11、运行G 命令运行程序12、运行D和R命令查看相应的内存单元和寄存器的数据是否与结果一致,如果不一致回到第3步纠正错误,也可以运行T命令逐条运行程序寻找错误指令位置再做修改。
实验内容:在数据段有一无序字数组array,要求编写程序把该数字按从小到大的顺序排列代码:data segmentn dw 7a dw 3,9,20,15,11,29,1 data endsprognam segmentmain proc farassume cs:prognam,ds:data start: push dssub ax,axpush axmov ax,datamov ds,axmov cx,ndec cxjz exitloop1: mov di,cxmov bx,0mov dx,1loop2: mov ax,a[bx]cmp ax,a[bx+2]jng cotinuemov a[bx],axxchg ax,a[bx+2]mov a[bx],ax cotinue:add bx,2loop loop2mov cx,diloop loop1exit:retmain endpprognam endsend start。
汇编语言循环程序设计引言:汇编语言是一种底层的计算机语言,它使用指令来操作计算机的硬件。
在汇编语言中,循环程序设计是一种常见的编程技巧,它可以使程序重复执行一段代码,达到循环的效果。
本文将介绍汇编语言中的循环程序设计,并通过示例代码详细解释其原理和应用。
一、循环的基本原理在汇编语言中,循环的实现依赖于条件判断和跳转指令。
循环程序通常包括以下几个步骤:1. 设置循环计数器的初始值;2. 执行循环体的代码;3. 更新循环计数器的值;4. 判断循环条件是否满足,如果满足则跳转到循环体的起始位置,否则结束循环。
二、示例代码:计算1到n的和下面是一个简单的汇编语言循环程序,用于计算从1到n的和(假设n已经存储在寄存器中):```asmMOV CX, n ; 将n的值存储到CX寄存器中MOV AX, 0 ; 将累加和的初始值设为0LOOP_START: ; 循环体的起始位置ADD AX, CX ; 将CX的值累加到AX中DEC CX ; 将CX的值减1CMP CX, 0 ; 判断CX的值是否为0JNZ LOOP_START ; 如果CX不为0,则跳转到循环体的起始位置; 循环结束后,累加和存储在AX寄存器中```以上代码中,使用了CX寄存器作为循环计数器,每次循环将CX的值减1,直到CX的值为0时跳出循环。
循环体中将CX的值累加到AX寄存器中,实现了从1到n的求和。
三、循环的嵌套在实际编程中,循环常常需要嵌套使用,以实现复杂的功能。
下面是一个示例代码,用于打印一个矩形图案:```asmMOV CX, 5 ; 设置外层循环的次数MOV DX, 5 ; 设置内层循环的次数OUTER_LOOP: ; 外层循环的起始位置PUSH CX ; 保存外层循环计数器的值INNER_LOOP: ; 内层循环的起始位置PUSH DX ; 保存内层循环计数器的值; 打印一个字符,如使用INT 21H中断POP DX ; 恢复内层循环计数器的值DEC DX ; 内层循环计数器减1CMP DX, 0 ; 判断内层循环计数器是否为0JNZ INNER_LOOP ; 如果不为0,则跳转到内层循环的起始位置POP CX ; 恢复外层循环计数器的值DEC CX ; 外层循环计数器减1CMP CX, 0 ; 判断外层循环计数器是否为0JNZ OUTER_LOOP ; 如果不为0,则跳转到外层循环的起始位置```以上代码中,使用了两个计数器CX和DX,分别控制外层循环和内层循环的次数。
实验三循环程序设计实验学生姓名:何茂杰学号:2010305104 专业班级:计算机本科一班指导老师:文远熔实验日期:实验成绩:一、实验目的1.掌握循环程序的设计方法;2.学会针对不同的问题,选用不同的组织循环的方法;3.进一步熟悉利用DEBUG程序修改参数的方法,并检查和验证结果的正确性。
二、实验内容1.计算y=x!X为8位无符号数Y为16位无符号数2.计算z=x+y其中x,y为5字节压缩BCD码,x,y,z的存放地址自定。
3. y=x/32,要求得商的整数和小数,x为四字节无符号数三、实验环境PC微机DOS操作系统或Windows 操作系统四、实验要求1.编写实验内容要求的两个程序;2.写出调试以上程序,即修改程序参数,检查结果的操作方法;3.熟悉源程序汇编、连接命令的使用方法即要回答的内容。
五、主要实验步骤一.算法过程1.分析算法思想2.根据算法分析3.编写程序测试,记录结果4.分析结果5总结二.对.EXE文件进行调试运行。
(1)用DEBUG调试运行,学会修改BL内容的方法;(2)对DSPKEY.EXE键入不同的字符,分别进行调试;(3)在MS-DOS下运行这两个.EXE文件。
六.心得体会实验让我了解了循环程序设计的应用。
让我明白如何应用循环程序设计。
源代码:code segmentassume cs:code,ds:codeorg 100hstart:push cspop dspush cspop esQ0:lea dx,Tipsmov ah,9int 21hQ1:mov ah,0int 16hcmp al,1bhjz exitcmp al,'0'jb Q1cmp al,'8'ja Q1mov ah,0ehint 10hsub al,30h;'0'or al,aljnz Q2mov ax,1 ;0!=1 jmp Q4Q2:mov ah,0 mov cx,axmov al,1xor dx,dxQ3:mul cxloop Q3Q4:cldlea di,Result add di,2lea bp,Table mov cx,5Q5:xor dx,dx div word ptr [bp] or al,30hstosbmov ax,dxadd bp,2loop Q5lea dx,Result mov ah,9int 21hjmp Q0exit:mov ah,4chint 21hcode endsend start。
实 验 报 告
── 学年 第 学期
实 验 课 程 汇编语言 学 生 姓 名 123 实 验 项 目 循环程序是设计 学 院 计算机科学技术
实 验 性 质 专业选修课
班 级 学 号
实 验 地 点
同 组 人 数 1
第 组
实 验 日 期 第 周 星期 第 节
成 绩
4
环 境 参 数
Dosbox —0.74 Masm 5。
0
一、实验目的及要求
二、实验原理、实验内容 三、实验仪器设备及材料 四、操作方法与实验步骤 五、实验数据记录及处理 六、实验结果分析及讨论
一、实验目的:
1.灵活运用各类许循环指令,掌握循环程序的设计方法 2. 学会针对不同的问题,选用不同的组织循环的方法。
3.伪指令 EQU 及操作符 '$'的使用。
4. COM 文件的要求和生成过程。
二、实验任务
1.编写程序:将一个包含有20个有符号数据的数组arrayM 分成两个数组,正数数组arrayP 和负数数组arrayN ,并分别把两个数组中的数据个数显示出来
源代码:
;十一个正数 九个负数 DATA SEGMENT
arrayM 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 0。
数学与软件科学学院实验报告
学期: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)成功插入原整序数组。