微机实验 子程序设计
微机原理子程序设计

实验三子程序设计1、实验目的:(1)熟悉汇编语言的编辑、汇编、连接、运行的全过程。
(2)了解汇编语言的程序结构、学习调用过程实现输入输出及用INCLUDE 命令包含文件的方法。
(3)子程序设计2.实验步骤:(1)用编辑软件记事本或EDIT 编辑一个扩展文件名为ASM的汇编语言源程序。
(2)用汇编程序TASM 汇编上述的汇编语言源程序,形成目标代码文件。
(扩展名为OBJ)(3)用连接程序TLINK连接目标代码文件,形成可执行文件。
(扩展名为EXE)(4)运行可执行文件。
观察执行结果,以验证其正确性。
3.实验内容:(1)从键盘上输入若干个十进制数(-32767<x<32767),然后排序并输出其升序后的结果。
.model small.stack 256.datacount=5array dw count dup (?)in_message db "please enter data:$"out_message db "sort result is :$".code.startupmov ah,9lea dx,in_messageint 21hmov cx,countmov si,offset arrayagain: call read ;输入count数据存入array数组中call dpcrlfmov [si],bxinc siinc siloop againmov cx,count ;排序(升序)dec cxagain2: lea si,arraymov di,cxagain1: mov ax,[si]cmp ax,[si+2]jle next1xchg ax,[si+2]xchg ax,[si]next1: add si,2loop again1mov cx,diloop again2mov ah,9lea dx,out_messageint 21hmov cx,count ;输出(升序)lea si,arrayagain3: mov bx,[si]call writecall dpcrlfinc siinc siloop again3mov ax,4c00hint 21hINCLUDE out_B_D.ASMINCLUDE in_D_B.ASMEND(2)从键盘上输入若干个十进制数(-32767<x<32767),然后排序并输出其降序后的结果。
实验四 子程序设计

数据分析并记录
3)根据上机操作进行记录(模仿实验三设计本实验执行情
况表格并记录)
表一
寻找最大数执行情况表 (实三)
DS:0000 DS:0001 DS:0002 1234H 5678H 2597H
SUM 8E43H
编写实验报告
子程序设计
6、实验报告要求(见附录)
1)实验报告要求有实验目的、要求、设备或仪 器、程序设计、步骤、数据分析。数据分析填 在报告本的原始数据栏。 2)画出实验内容1)2)程序设计流程图、写出程 序清单并有简要注释。 3)写出实验过程中所遇到的问题与解决的办法。
实验设备 仿真软件使用
子程序设计 d. 对原程序进行汇编与链接,通过观察输出 窗口的信息,确定对汇编程序的修改。有错误, 进行修改,随即汇编与链接,直到无错误为止, 形成 *.exe可执行的文件。 e. 在调试界面中采用不同方式调试程序(采用 单步、连续等运行方式,调试程序),通过 “vars”功能,观察符号变量数据变化。查 看????单元中的内容。
1)多数求和程序设计(求和部分使用子程序) 。 2) N!(N=6)计算程序设计。
2、实验目的
了解子程序结构,掌握其编程与调试方法
实验设备 仿真软件使用
子程序ቤተ መጻሕፍቲ ባይዱ计
3、实验设备与仪器
PC机、emu8086仿真软件。
4、实验步骤
a. 检查实验设置外接电源,开启PC机。 b. 进入软件集成操作环境主界面,按NEW建立新 文件,即可开始输入源程序。 c. 输入程序后,按Ctrl+S保存程序(规定扩展 名为 *.asm源程序文件)。
数据分析并记录
子程序设计
5、程序设计
1)工作原理 子程序又称过程,由过程伪操作指令PROC定 义开始,ENDP定义结束,属性可以是NEAR或FAR。 与主程序在同一代码段中的子程序使用NEAR属性, 与主程序不在同一代码段中的子程序使用FAR属 性。
“汇编语言与微机原理”课程教学中汇编子程序实验设计

5 8 ・
Co mp u t e r Er a No. 2 2 01 3
“ 汇 编语言与 微机原理’ ’ 课 程教学中 汇编子 程序实 验设计
赵 永标 。张 其林 ,詹 彬 ,康长 青
( 湖北文理学院数学与计算机科学学院,湖北 襄阳 4 4 1 0 5 3 )
摘 要 :“ 汇编语 言与微 机原理” 是 计算机科 学与技术 专业 的必修基 础课 程。在教 学中汇编语 言子程序 实验设计普遍存
关键词 :汇编语言 ;子程序 ;宏 ;中断 ;实验设计 中图分类号 : G6 4 2 文献标志码 : B 文章 编号 : 1 0 0 6 — 8 2 2 8 ( 2 0 1 3 ) 0 2 — 5 8 — 0 2
Ex p e r i me n t a l d e s i g n o f a s s e mb l y s u b — r o u t i n e s i n “ a s s e mb l y l a n g u a g e a n d mi c r o c o mp u t e r p r i n c i p l e ’ ’
Z h a o Y o n g b i a o ,Z h a n g Qi l i n ,Z h a n Bi n ,Ka n g C h a n g q i n g
( S c h o o l o f M a t h e m a t i c s a n d C o m p u t e r S c i e n c e , H u b e i U n i v e r s i t y f o A r t a n d S c i e n c e , X i a n g y a n g , H u b e i 4 4 1 0 5 3 ,C h i n a )
实验报告 子程序设计实验

实验5 子程序实验一.实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。
4. 掌握多模块程序设计方法二.实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。
DATAS SEGMENTBUF DB00000111B,00100001B,00100010B,00000011B,00000101B,B,B,00100100B,B,01010010BCAN DB $-BUF ;定义常量CANDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASMAIN PROC FAR ;主程序块START:MOV AX,DATASMOV DS,AXMOV CL,10LEA SI,BUFLOOP1: ;调用子程序语句call HEXACcall DISPDEC CANJNZ LOOP1EXIT:MOV AH,4CHINT 21HMAIN ENDPHEXAC PROC NEAR ;二进制转换成十六进制子程序MOV BL,[SI]INC SIRETHEXAC ENDP显示子程序DISP PROC NEAR ;MOV CL,4MOV CH,2MOVE: ;移位语句ROL BL,CLMOV DL,BLAND DL,0FHADD DL,30HCMP DL,'9'JBE PRINTADD DL,07HPRINT:MOV AH,02H ;显示语句INT 21HDEC CHJNZ MOVEMOV DL,' 'MOV AH,02HINT 21HRETDISP ENDPCODES ENDSEND START2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符'b'的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
微机实验报告子程序结构的设计方法

实验五 子程序结构的设计方法专业:材料物理; 姓名:曾瑞; 学号:20113012300191,实验内容,实验内容 编程计算编程计算N !,从键盘上接受10以内的数,计算出其阶乘后在屏幕显示结果;计算出其阶乘后在屏幕显示结果;2,实验要求,实验要求用子程序编写计算用子程序编写计算N !的代码以及结果显示代码;!的代码以及结果显示代码;3,实验目的,实验目的学习子程序结构,了解子程序的调用、返回的过程,掌握其编程的方法;4,程序流程图,程序流程图5,源程序,源程序;FILENAME ZENG.ASM DA T A SEGMENTMESG1 DB 'PLEASE INPUT A NUMBER BETWEEN 0 AND 9',0DH,0AH,'$' MESG2 DB ' ERROR MESSAGE!',0DH,0AH,'$' MESG3 DB '!=','$' STORE DW ? DA T A ENDS STACK SEGMENT DB 256 DUP(?) 开始开始从键盘上取得一个数字,并转换成二进制数转换成二进制数调用CALCUL 调用PRINT 调用CRLF 结束结束计算输入数字的阶乘的阶乘将结果显示输出将结果显示输出显示回车换行显示回车换行STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MAIN PROC FAR START: MOV AX,DATA MOV DS,AX MOV DX,OFFSET MESG1 ;输出提示语句输出提示语句MOV AH,09H INT 21H MOV AH,1 ;键盘输入一个字符并回显键盘输入一个字符并回显 INT 21H CMP AL,20H ;如果输入的是空格,则返回如果输入的是空格,则返回 JZ EXIT XOR AL,30H ;将ASCII码转换成二进制数码转换成二进制数 CMP AL,0 ;将AL中数与0比较比较 JNZ NEXT INC AL ;若为0,则加一,则加一NEXT: CMP AL,9 ;与9进行比较进行比较JA ERROR ;若大于9,则跳转,则跳转PUSH AX ;将AX中内容堆栈,保护输入数保护输入数 LEA DX,MESG3 MOV AH,09H INT 21H POP AX CALL CALCUL CALL PRINT CALL CRLF JMP START ERROR: MOV DX,OFFSET MESG2 ;输出提示信息,提醒输入有误输出提示信息,提醒输入有误 MOV AH,09H INT 21H JMP START EXIT: MOV AH,4CH INT 21H MAIN ENDP CALCUL PROC MOV AH,0 MOV CX,AX ;CX存放输入的数字存放输入的数字MOV AL,1 ;将AX初始值赋1 MOV DX,0 MOV BX,0 AGAIN: INC BX MUL BX CMP BX,CX JNZ AGAIN ;若BX小于CX,则循环执行,则循环执行 RET CALCUL ENDP PRINT PROC MOV CX,0 CMP DX,0 ;将DX中内容与0比较比较 JZ THEN MOV BX,10 DIV BX PUSH DX INC CX THEN: MOV DX,0 MOV [STORE],AX ;[STORE]是个字单元,在数据段已是个字单元,在数据段已 MOV BX,10 ;有定义有定义DIV BX PUSH DX ;将余数堆栈将余数堆栈INC CX ;CX当计数器,存放堆栈的次数当计数器,存放堆栈的次数 CMP DX,[STORE] JNZ THEN ;若余数与被除数不等,继续循环若余数与被除数不等,继续循环 DISPLAY: POP DX ;出栈,把数据赋给DX ADD DL,30H ;DL存放欲显示数的ASCII码MOV AH,2 INT 21H LOOP DISPLAY RET PRINT ENDP CRLF PROC MOV DL,0DH ;显示回车与换行显示回车与换行MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H RET CRLF ENDP CODE ENDS END MAIN 5,实验结果及分析,实验结果及分析(1)程序运行结果如下:)程序运行结果如下:PLEASE INPUT A NUMBER BETWEEN 0 AND 9 0!=1 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 1!=1 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 2!=2 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 3!=6 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 4!=24 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 5!=120 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 6!=720 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 7!=5040 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 8!=40320 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 9!=362880 PLEASE INPUT A NUMBER BETWEEN 0 AND 9 H ERROR MESSAGE !注意:当输入其他字符时,比如H ,则显示‘ERROR MESSAGE !’ (2)需要说明的有以下几点:)需要说明的有以下几点: ①① 用INT21H 指令执行功能调用会影响AX 中的数据,因此在调用前必须将AX 中的数据进行堆栈操作。
子程序设计实验报告范文精简处理

子程序设计实验报告范文精简处理实验报告是对实验目的、流程、结果和结论等内容的详细描述和总结。
以下是一份精简处理的子程序设计实验报告范文,共计1245字。
#实验报告名称:子程序设计实验##一、实验目的1.熟悉子程序的定义和使用方法;2.掌握子程序设计的基本思路和技巧;3.实践并提高对程序模块化设计的理解和能力。
##二、实验设备和材料-计算机-C语言编程环境##三、实验方法与流程1.根据实验要求,在C语言编程环境中编写一个独立的子程序;2.使用该子程序计算并输出指定的结果;3.程序编写完成后,编译并运行该程序,观察结果是否符合要求。
##四、实验内容1. 设计一个名为`sum`的子程序,接受一个整型数组和数组长度作为参数,计算数组元素之和,并返回该和;2.编写主程序,使用该子程序求解一个整型数组的元素之和;3.输出求和结果,观察是否正确。
##五、实验结果与分析实验中,我们使用了一组测试数据进行验证。
首先,定义一个整型数组`arr`,其中包含5个元素:{1, 2, 3, 4, 5}。
然后,将该数组和数组长度传递给`sum`子程序进行求和操作。
经过运行,我们得到的结果是15,与我们预期的结果一致。
因此,可以判断子程序设计正确,并成功实现了数组元素之和的计算功能。
##六、实验总结通过本次实验,我们成功设计并实现了一个独立的子程序,在主程序中调用该子程序计算了一个整型数组的元素之和。
通过此次实验,我们进一步熟悉了子程序的定义和使用方法,掌握了子程序设计的基本思路和技巧,并提高了对程序模块化设计的理解和能力。
这对于今后的软件开发和编程工作具有重要意义。
##七、实验心得本次实验让我更加深入地理解了子程序设计的重要性和作用。
通过将功能模块化,我们可以方便地组织和管理程序代码,提高代码的复用性和可维护性。
在实际的软件开发中,子程序设计及其正确使用是非常关键的,能够大大提高开发效率和代码的可靠性。
因此,我会继续学习和掌握更多的子程序设计技巧,并应用于未来的编程工作中。
实验十一 子程序设计

实验十一子程序设计知识提要:1、掌握子程序的定义语句;过程名 PROC [near/far]过程体RET过程名 ENDP其中过程名的命名方法与变量名相同,同一源程序中不能有相同的过程名.PROC为过程定义开始的伪指令,ENDP为过程定义结束伪指令,且PROC-ENDP必须配对使用。
配对的PROC-ENDP 前面的过程名应相同。
NEAR/FAR定义了过程的属性,前者表示所定义的过程只能被相同代码段的程序调用,称为段内调用;而后者所表示的过程只能被不同代码段的程序调用,称为段间远调用。
2.子程序结构形式一个完整的子程序一般应包含下列内容:1.)子程序的说明部分在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法.说明时,应含如下内容:.子程序名:命名时要见名中意..子程序的功能:说明子程序完成的任务;.子程序入口参数:说明子程序运行所需参数及存放位置;.子程序出口参数:说明子程序运行结果的参数及存放位置;.子程序所占用的寄存器和工作单元;.子程序调用示例;2、)掌握子程序的调用与返回在汇编语言中,子程序的调用用CALL,返回用RET指令来完成。
当发生CALL过程调用时,返回地址入栈;而运行RET指令时,则由栈顶取出返回地址。
CALL指令执行分两步走;第一步,保护返回地址,利用堆栈实现,即将返回的地址压入堆栈;第二步,转向子程序,即把子程序的首地址送入IP 或CS :IP 。
RET 指令功能是返回主程序,即把子程序的返回地址送入IP 或CS :IP 。
.段内调用与返回:调用子程序指令与子程序同在一个段内。
因此只修改IP ;.段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS :IP 。
3.)子程序的现场保护与恢复保护现场:在子程序设计时,CPU 内部寄存器内容的保护和恢复,在运行主程序时已经占用了一定数量的寄存器,子程序执行时也要使用寄存器。
子程序执行完返回主程序后,要保证主程序按原来状态执行,这就需要对那些在主程序和子程序中都要使用的寄存器的内容在子程序体执行之前加以保护,这就是保护现场。
8086 汇编语言子程序程序设计

汇编语言程序设计实验报告学院:计算机科学与技术专业:计算机科学与技术班级:计科131MOV AX,4C00HINT 21HMAIN ENDPPROADD PROC NEARPUSH AXPUSH CXPUSH SIPUSH DIMOV SI,[BX]MOV DI,[BX+2]MOV CX,[DI]MOV DI,[BX+4]XOR AX,AXNEXT:ADD AX,[SI]ADD SI,2LOOP NEXTMOV [DI],AXPOP DIPOP SIPOP CXPOP AXRETPROADD ENDPARY DW 1,2,3,4,5,6,7,8,9,10COUNT DW 10SUM DW ?TABLE DW 3 DUP(?)CODE ENDSEND MAIN使用相应的文本编辑器建立文件LAB5.asm,内容如上所示。
二. 生成可执行文件:1.汇编:C:\masm> masm lab5;2.连接:C:\masm> link lab5;三. 请写出此程序中的变量ary,count,sum 的EA,并判断此程序的功能:四. 用debug 调试此程序时,第一条指令的段内EA 是多少?此程序数据段内偏移地址为0 的字单元数据为多少?其对应的机器指令是什么?-L ;加载程序文件lab5.exe-R ;查看IP 与CS 寄存器的内容-D DS:0 ;查看当前数据段内偏移地址为0 的字单元数据-U ;查看机器指令实验二:编写一个子程序,实现在屏幕的指定位置,用指定颜色,显示一个用0 结尾的字符串源程序如下data segmentstr db 'display string',0data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov dh,8mov dl,21mov cl,3mov si,offset strcall show_strmov ax,4c00hint 21h;----------------------------show_str proc nearpush axpush cxpush dxpush espush simov es:[bx], cljcxz okmov es:[bx+1], dlinc siadd bx, 2jmp short sok:pop sipop espop dxpop cxpop bxpop axret; 子程序:divdw; 要求:进行不会除法溢出的除法运算,被除数为dword,除数为word,结果为dword ; 参数:(ax) = 被除数dword型的低16位; (dx) = 被除数dword型的高16位; (cx) = 除数; 返回:(dx) = 结果的高16位; (ax) = 结果的低16位; (cx) = 余数divdw:mov bx, ax ; 缓存ax——被除数的低16位mov ax, dx ; ax = H,被除数的高16位mov dx, 0div cx ; ax 为商,dx为余数 = rem(H/N) * 65536push ax ; 结果的商,也就是最后要放在dx中的mov ax, bx ; dx为 rem(H/N) * 65536, 为高16位,ax为低16位,再进行一次除法运算div cx ; ax 为商——最后结果的低16位,dx为余数——为最后结果,应赋给cxmov cx, dxpop dxretcode endsend start实验结果实验一:变量ary,count,sum 的EA分别是00140,00154,00156此程序的功能是数列求和实验二:实验三:实验总结这次实验,感觉难度最大的就是做2个子程序的设计,在网上向好友请教了N回!还犯了一些低级的错误,如将16位的寄存器的内容传送到字符型数字串里去,这很明显是不对的,在逆序时寄存器的高16位会直接把正常的数字字符冲掉,还有就是将当我直接将字型单元的内容传送字型单元时,编译器会报错,不过提示是它后面的指令错误。
微机子程序设计2

一、实验目的1.掌握8255工作方式1时的使用及编程。
2.进一步掌握中断处理程序的编写。
二、实验内容1.按图33(A)8255方式1的输出电路连好线路。
2.编程:每按一次单脉冲按钮产生一个正脉冲使8255产生一次中断请求,让CPU进行一次中断服务:依次输出01H、02H,04H,08H,10H,20H,40H,80H 使L0~L7依次发光,中断8次结束。
流程图原理图程序/*******************************//* 可编程并行接口(二) *//* 8255方式1输出实验 (A口) *//*******************************/#include <stdio.h>#include <conio.h>#include"ApiEx.h"#pragma comment(lib,"ApiEx.lib")int Count=0x01; /*响应中断次数为8*/void IntS();void main(){printf("--------------------EXP21_10_8255-1_1---------------------\n");printf("1. 8255 (PA0-PA7) === TPC (L0-L7)\n");printf("2. I/O (288-28F) === 8255 (CS)\n");printf("3. 8255 (PC3) === TPC (IRQ)\n");printf("4. 8255 (PC6) === (K8(DMC))\n");printf("Press any key to begin!\n\n");getch();if(!Startup()) /*打开设备*/{printf("ERROR: Open Device Error!\n");return;}printf("Press DMC!Press any key to exit!\n");RegisterLocalISR(IntS); /*注册中断程序*/EnableIntr(); /*开中断*/PortWriteByte(0x28b,0xa8); /*设8255工作方式1输出*/PortWriteByte(0x28b,0x0d); /*将PC6置位*/while(!kbhit()) Sleep(10);DisableIntr(); /*关中断*/Cleanup(); /*关闭设备*/}void IntS(){PortWriteByte(0x288,Count); /*从PA口输出i,初值为0x80*/printf("This is a Intrupt! Out = %x \n",Count);Count<<=1; /*Count左移一位*/if(Count == 0x100)exit(0);}实验二一、实验目的1.掌握8255工作方式1时的使用及编程。
实验四 子程序调用编程设计

实验四子程序调用编程设计子程序也叫过程,过程名即子程序入口的符号地址,过程内至少有一条RET指令,过程名具有段属性、偏移地址属性、距离属性等三种属性。
其格式:过程名:PROC 属性(near or far)···RET过程名 ENDP子程序调用几种常见形式:1、段内近程调用:主程序和过程在同一代码段,过程具有NEAR属性。
2、段间调用:主程序和过程在同一模块,不同代码段,过程具有FAR属性。
3、远程调用:主程序和过程在不同模块。
主、子程序取不同文件名,分别编辑、编译,连接时连在一起,运行主程序。
LINK 主+子↙DEBUG 主.EXE↙实验内容:用主模块和段内近程调用对讲义给出的十个数从小到大排序,将排序后的数据复制到附加段。
冒泡法排序是程序设计较简单常用的排序算法:每次比较相邻的元素,如果第一个比第二个大,就交换他们两个,对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,直到没有任何一对数字需要比较,即该数列已经排序完成。
这个算法的名字由来是因为越小的元素经交换慢慢“浮”到数列的顶端而得名。
data1 segmentx db …data1 endsdata2 segmenty db 10 dmp(0) data2 endscode segment assume cs:code assume ds:data1 assume es:data2 start: mov ax,data mov ds,axcall sub1 call sub2 mov ah,4ch int 21h sub1 proc near···retsub1 endpsub2 proc near···retsub2 endpcode endsend startG=0,末地址↙(mov ah,4ch对应的地址作末地址)用T命令调试运行程序时遇到CALL语句可用P命令跳过子程序一次完成,不用进入子程序内部,否则用T命令进入到子程序内部,遇到INT 21H语句要用P命令。
华工微机原理实验四子程序设计实验报告

华南理工大学微机原实验四:子程序设计一.实验目的1、学习子程序的定义和调用方法。
2、掌握子程序、子程序嵌套的结构。
3、掌握子程序的程序设计、编制及调试方法。
二.实验内容程序采用菜单式选择,可接收用户输入的命令(1~5),各命令如下:按1键完成字符串小写字母变大写字母用户输入一由英文大小写字母或数字0~9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其它字符不变,并在屏幕上显示。
用户按任一键,重做,按ESC键,返回主菜单。
按2键完成找最大值(二选一)1、接收用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来。
2、接收用户输入若干无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按3键完成排序(二选一)1、接收用户输入的可显示字符串,以回车结束。
程序按ASCII码值大小由大到小排序并输出显示。
2、接收用户输入若干个有符号8位数(以空格逗号为分隔符,以回车结束)。
程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按4键显示时间首先提示用户对时,即用户输入时,分,秒(以空格或冒号分隔,以回车结束),然后,在屏幕上不断显示时间,格式为:××(时):××(分):××(秒),最好定点显示。
用户按任一键,重新对时,按ESC键,返回主菜单。
按5键,结束程序运行,返回系统提示符。
三.程序与流程图主程序的简略流程子程序一的简略流程图子程序二的简略流程图子程序三的简略流程图子程序4,显示时间流程图四、源程序代码DATA SEGMENTORG9999HMENU DB0DH,0AH,'Programed by Deng Tengfei Class Electronic Material Grade 09',0DH,0AH,;菜单DB'Please input1~5to choose service',0DH,0AH,DB'1:Convert a small letter to a big letter',0DH,0AH,DB'2:Seek the bigest number',0DH,0AH,DB'3:Put the character string in order',0DH,0AH,DB'4:Set time and check time',0DH,0AH,DB'5:End the program$'MEG0DB'Please choose function$';提示信息MEG0~MEG8MEG1DB'You have choose the function1.',0DH,0AH,'Please input the character string you want to convert:$'MEG2DB'You have choose the function2.',0DH,0AH,'Please input the character string:$'MEG3DB'You have choose the function3.',0DH,0AH,'Please input the character string you want to sort$'MEG4DB'You have choose the function4.',0DH,0AH,'Please input the time you want to set in format like:xx:xx:xx$'MEG5DB'The program is end$'MEG6DB'Sorry.you have chosen a undefined function.Please input a correct function number$' MEG7DB'Fail to set time$'MEG8DB'Press any key to do again or press the ESC key to return to the main menu$'FLAG DB-1;冒泡排序中使用的标志DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC NEAR;主程序MOV AX,DATAMOV DS,AXCIN:LEA DX,MENU;输出提示信息MOV AH,09HINT21HCALL ENT;输出回车换行LEA DX,MEG0MOV AH,09HINT21HCALL ENTMOV AH,01HINT21HCMP AL,30H;判断功能号JLE EORCMP AL,31HJE F1CMP AL,32HJE F2CMP AL,33HJE F3CMP AL,34HJE F4CMP AL,35HJE F5EOR:CALL ENTLEA DX,MEG6;输出出错信息MOV AH,09HINT21HJMP CINF1:CALL ENT;功能1LEA DX,MEG1MOV AH,09HINT21HCALL ENTCALL FUN1;调用子程序1MOV AH,01HINT21HCMP AL,1BHJNE F1JMP CINF2:CALL ENT;功能2LEA DX,MEG2MOV AH,09HINT21HCALL ENTCALL FUN2;调用子程序2MOV AH,01HINT21HCMP AL,1BHJNE F2JMP CINF3:CALL ENT;功能3LEA DX,MEG3MOV AH,09HINT21HCALL ENTCALL FUN3;调用子程序3MOV AH,01HINT21HCMP AL,1BHJNE F3JMP CINF4:CALL ENT;功能4LEA DX,MEG4MOV AH,09HINT21HCALL ENTCALL FUN4;调用子程序4MOV AH,01HINT21HCMP AL,1BHJNE F4JMP CINF5:MOV AH,4CH;功能5,终止程序INT21HFUN1PROC NEAR;子程序1PUSH AXPUSH CXPUSH DXPUSH SIMOV AH,0AH;字符串输入INT21HCALL ENTMOV SI,DXINC SIMOV CL,[SI];设定循环次数MOV CH,0JIK:INC SIMOV AL,[SI]CMP AL,0DH;判断字符ASCII码JE KLCMP AL,61HJB JKCMP AL,7AHJA JKSUB AL,20H;小写转大写JK:MOV DL,AL;输出字符MOV AH,02HINT21HLOOP JIKCALL ENTLEA DX,MEG8MOV AH,09HINT21HKL:POP SIPOP DXPOP CXPOP AXRETFUN1ENDPFUN2PROC NEAR;子程序2PUSH AXPUSH CXPUSH DXPUSH SIMOV AH,0AHINT21HCALL ENTMOV SI,DXINC SIMOV CL,[SI]MOV CH,0INC SIMOV AL,[SI]FH:INC SI;循环比较CMP AL,[SI]JA FGMOV AL,[SI]FG:LOOP FHMOV DL,ALMOV AH,02HINT21HCALL ENTLEA DX,MEG8MOV AH,09HINT21HPOP SIPOP DXPOP CXPOP AXRETFUN2ENDPFUN3PROC NEAR;子程序3PUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DIMOV AH,0AHINT21HCALL ENTMOV SI,DXINC SIMOV BL,[SI]MOV BH,0INC SIMOV DI,SILP1:CMP FLAG,0;根据标志判断JE LP3DEC BX;检查循环次数CMP BX,0JE LP3MOV CX,BXMOV SI,DIMOV FLAG,0LP2:MOV AL,[SI];前后比较CMP AL,[SI+1]JLE NEXTXCHG AL,[SI+1]MOV[SI],ALMOV FLAG,0FFHNEXT:INC SILOOP LP2;内循环继续JMP LP1;退出内循环LP3:DEC DI;重新设定循环次数MOV CL,[DI]MOV CH,0LP4:INC DI;循环输出字符MOV DL,[DI]MOV AH,02HINT21HLOOP LP4CALL ENTLEA DX,MEG8MOV AH,09HINT21HPOP DIPOP SIPOP DXPOP CXPOP BXPOP AXRETFUN3ENDPFUN4PROC NEAR;子程序4PUSH AXPUSH BXPUSH CXPUSH DXCALL CROT;调用子程序CROTMOV CH,AL;装入入口参数MOV AH,01HINT21HCALL CROTMOV CL,ALMOV AH,01HINT21HCALL CROTMOV DH,ALMOV DL,0CALL ENTMOV AH,2DH;调DOS中断置时间INT21HCMP AL,0FFHJE FALPRT:PUSH DX;输出时间MOV AL,CHMOV AH,0MOV BL,0AHDIV BLADD AL,30HADD AH,30HMOV DL,ALMOV DH,AHMOV AH,02HINT21HMOV DL,DHINT21HMOV DL,3AHINT21HMOV AL,CLMOV AH,0DIV BLADD AL,30HADD AH,30HMOV DL,ALMOV DH,AHMOV AH,02HINT21HMOV DL,DHINT21HMOV DL,3AHINT21HPOP DXMOV AL,DHMOV AH,0DIV BLADD AL,30HADD AH,30HMOV DL,ALMOV DH,AHMOV AH,02HINT21HMOV DL,DHINT21HMOV AH,2CH;调DOS中断取时间INT21HMOV AL,0AH;写入OCW3OUT20H,ALNOP;延时NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPIN AL,20H;读取IRRAND AL,02HJNE MKCALL COV;调子程序COVJMP PRTFAL:LEA DX,MEG7MOV AH,09HINT21HMK:CALL ENTMOV AH,01HINT21HLEA DX,MEG8MOV AH,09HINT21HPOP DXPOP CXPOP BXPOP AXRETFUN4ENDPCROT PROC NEAR;子程序CROT,完成ASCII码转换成两位十进制数PUSH BXPUSH CXPUSH DXMOV BL,0;初始化BL和BHMOV BH,0AHMOV DX,02H;设循环次数GET:MOV AH,01HINT21HSUB AL,30HCMP AL,0JB FALCMP AL,09HJA FALXCHG AL,BLMUL BHADD AL,BLXCHG AL,BLDEC DXCMP DX,0JNE GETMOV AL,BLPOP DXPOP CXPOP BXRET CROT ENDPCOV PROC;格式控制,使光标回到上个制表位PUSH AXPUSH CXPUSH DXMOV CX,08HMOV AH,02HMOV DL,08HREC:INT21HLOOP RECPOP DXPOP CXPOP AXRETCOV ENDPENT PROC;格式控制,输出回车换行MOV DL,0DHMOV AH,02HINT21HMOV DL,0AHMOV AH,02HINT21HRETENT ENDPMAIN ENDPCODE ENDSEND MAI五、程序调试及运行结果:主菜单1、功能一(小写字母转大写字母):2、功能二(找出ASCII码最大的字符):3、功能三(按ASCII码把字符从大到小排列):4、功能四(显示跳动的时间):5、功能五(退出程序):如果是错误的输入,提示如下:六、实验心得通过这个实验,基本掌握了子程序的调用方法,子程序可以单独设计,主程序做好了,可以嵌套具体功能的子程序实现需求,这个实验子程序可以分开调试,子程序决定具体功能,主程序是一个框架,这点有种化大为小的思想,告诉我们一个复杂功能的程序,可以分模块,按功能,一部分一部分地实现,最后嵌套,进行最后调试。
微机原理实验(循环程序设计)

教
师
评
阅
教师签字年月日
备注:1.文件名命名方式为:学号+姓名+实验序号.DOC
2.将文件按附件形式添加后提交
DATA SEGMENT
DB 06H,12H,88H,82H,90H,22H,33H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV DI,0000H
MOV CL,[DI]
XOR CH,CH
MOV BL,CH
INC DI
A0: MOV AL,[DI]
TEST AL,80H
JE A2
INC BL
A2: INC DI
LOOPA0
MOV [DI],BL
MOV AX,4C00H
INT 21H
CODE ENDS
END START
实
验
步
骤
(1)用编辑软件如:EDIT,输入源程序,并保存,后缀名为.ASM。
-U ;先用反汇编来查看源程序装入的地址和数据段的地址
:
-G=xxxx:xxxx;从程序装入的地址处,开始运行程序
(5)查看实验结果。
(6)也可使用EMU8086软件进行调试
骤
实
验
分
析
与
总
结
1.通过实验掌握了宏汇编命令的基本格式及对循环结构的理解。
2.熟悉并掌握了循环结构程序设计的方法。
2.求某数据区内负数的个数。
设数据区的第一个单元存放数据的个数,从第二个单元开始存放数据,在最后一个单元存放结果。
微机实验--子程序设计

微机实验三分支和循环程序设计实验一、分支程序设计实验1.实验目的1.掌握分支程序的结构。
2掌握分支程序的设计、调试方法。
2.实验设备微机一台3.内容设计一数据块间的搬移程序设计思想:程序要求把内存中一数据区(称为源数据块)传送到另一存贮区(称为目的数据块)。
源数据块和目的数据块在存贮中可能有三种情况。
对于两个数据块分离的情况,数据的传送从数据块的首址开始,或者从数据块的末址开始均可,但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。
可以得出以下结论:当源数据块首址〉目的块首址时,从数据块首址开始传送数据。
当源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
流程图:结果:在源数据块中存入6个数,分别使SI大于、等于、小于DI均发觉数据正确传送。
可见程序正确。
实现代码如下:DATA SEGMENTORG 3500HSRC_MESS DB 1,2,3,4,5,6ORG 3510HNEW_LOC DB 20 DUP(0)DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,SRC_MESSLEA DI,NEW_LOCMOV CX,6CLD ;DF置0CMP SI,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2) NEXT2: REP MOVSBNEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据DEC SI ;ADD DI,CX ;DI+=DI+CX-1DEC DI ;STD ; DF置1JMP NEXT2 ;CODE ENDSEND START结果显示:将3500H开始的1,2,3,4,5,6复制到3510H开始的地址。
汇编语言程序设计实验报告三(子程序设计实验)

汇编语言程序设计实验报告三(子程序设计实验)汇编语言程序设计实验报告三(子程序设计实验)实验目的掌握主程序与子程序之间的调用关系及其调用方法。
掌握子程序调用过程中近程调用与远程调用的区别。
熟练掌握码型变换的程序。
实验内容从键盘输入二位非压缩BCD数,存入AX寄存器中,编程实现将其转换为二进制数,并在屏幕上显示。
要求码型转换程序用远程子程序编写,字符显示用近程子程序编写。
数据可循环输入,遇‘00’结束。
实验准备预习子程序设计的基本方法,根据实验内容要求编写出实验用程序。
熟悉键盘输入和字符显示的程序段的编制。
实验步骤编辑、汇编源程序,生成可执行文件。
执行程序,检查输入、输出结果,看是否正确。
如不正确,用DEBUG检查,修改源程序,再汇编、运行,直到程序正确为止。
用DEBUG的T命令或P命令跟踪程序的执行,观察在远程和近程调用过程中,堆栈的变化情况。
实验报告要求分析近程调用和远程调用的主要区别。
用DEBUG命令观察执行过程有何不同。
分析实验结果及所遇到的问题的解决方法。
程序流程图开始TRAN程序标准序开始读入十进制数据放AX中AXAXAND0F0FH是00?YBLALN调用转换子程序结束AL左移3位回车、换行BL左移1位于ALAL+BL主程序流程图ALAL+AHRET转换子程序TRAN流程图程序清单STASEGMENTSTACK’STACK’DB100DUP(0)STAENDS GSAGSEGMENTPARA‘CODE’ASSUMECS:CSAG MAINPROCFARSTRAT:PUSHDSSUBAX,AXPUSHAXREV:MOVAH,1INT21HMOVBL,ALINT21HMOVAH,ALMOVAL,BLCMPAX,3030H JEENDTRAN CALLNEARPTRTRAN CALLFARPTRCON MOVAL,0DH CALLFARPTRDISP MOVAL,0AH CALLFARPTRDISP MOVAL,0AH CALLFARPTRDISP JMPREV ENDTRAN:RET MAINENDP TRANPROCNEAR ANDAX,0F0FHMOVBL,ALMOVBL,ALMOVCL,3SHLAL,CLMOVCL,1SHLBL,CLADDAL,BLADDAL,AHRETTRANENDPCSAGENDS CSBGSEGMENTPARA’CODE’ASSUMECS:CSBG CONPROCFARPUSHAXMOVCL,4 SHRAL,CL ADDAL,30H CMPAL,39H JBECON2 ADDAL,7CON2:PUSHAX MOVAL,0DH CALLFARPTRDISP MOVAL,OAH CALLFARPTRDISP POPAX CALLFARPTRDISP POPAX ANDAL,0FHADDAL,30H CMPAL,39H JBECON1ADDAL,7CON1:CALLFARPTRDISP RETCONEDNP DISPPROCFAR PUSHBXMOVBX,0MOVAH,14INT10HPOPBXRETDISPENDPCSBGENDS ENDSTART。
实验3(子程序设计)

SI,CX赋初值
取第一个数 存于BH、BL
INC SI 取数存于AL
是
BH:存放较大值 BL:存放较小值 AL:当前值 比较分以下三种情况: AL比BL小 AL比BH大 AL在BL、BH之间
AL<BL 否 否 AL>BH 是 BH←AL DEC CX 否 CX=0? 是 结束
BL←AL
(3)编程要点
Hale Waihona Puke 3、编程提示(1)数据要求
可在数据段内定义;也可从键盘接收任意字符。
(2)子程序设计
①子程序定义格式
子程序名 PROC … RET ;子程序返回 NEAR或FAR;NEAR可省略
子程序名 ENDP ②子程序调用 CALL 子程序名
3、编程提示
开始
(3)编程要点(重点)
• 如何找最大、最小数?
( 子程序流程图如右图所示)
找到后,如何显示?
•考虑以下情况:
①一位十进制,如0~9如何显示?(必须完成) (常用DOS功能调用中的2号功能调用,注意数字与ASCII值对应关系。) ②两位十六进制,如3EH,80H,12H…如何在屏幕上显示?(建议试做) (分高低位显示,请参考实验指导书P76。)
4.注意事项
(1)段内调用时,子程序所处的位置。
子程序设计2实验报告中必须有程序流程图3实验报告中必须有对程序调试的小结4实验报告中必须有源程序清单及注释
1、实验项目
设有10个无符号数的字节序列,利用子程序的方法编写 程序,找出其中的最大、最小值,并在屏幕上显示。
2、实验目的
(1)掌握子程序设计的基本方法,包括子程序的定义、 调用和返回。 (2)巩固常用DOS功能调用。
(2)数据变量定义格式。
实验8_子程序设计

mov bx,[bp+4] xor ax,ax adn: add al,[bx] adc ah,0 inc bx loop adn mov [bx],ax ret 4 sum endp proce ends end star 2. 下列程序实现了子程序递归调用求阶乘。请汇编并调试程序,学习程序的设计方法 和堆栈的变化过程。 程序: stack segment stack db 100h dup(?) stack ends data segment resuldw ? data ends code segment mainproc far assume cs:code,ds:data,ss:stack start:push ds sub ax,ax push ax mov ax,data mov ds,ax mov ax,5 call fact mov resul,ax ret fact proc and al,al jne iia mov al,1 ret iia: push ax dec al call fact x2: pop cx mul cl ret fact endp
实验八 子程序设计
8.1 实验目的
(1)掌握子程序设计方法,合理划分层次 (2)掌握子程序的调用与返回的方法 (3)掌握子程序间传递参数的方法。 (4)了解子程序的嵌套与递归
8.2 预备知识
8.2.1 基本概念
子程序也称为过程,使用子程序可以缩短源程序的长度、节省目标程序的存储空间,也 可以提高程序的可维护性和共享性。汇编语言的子程序相当于高级语言中的过程和函数。在 同一个程序中经常出现的功能和结构形式相同,但变量的赋值不同的程序段可以定义为子程 序。有些程序对于某个用户可能只用到一次,但是对于用户来说经常用到(如二进制到十进 制的转换),这些常用的特定功能的程序段也可以定义为子程序的形式。
微机原理实验之子程序设计

子程序设计实验一、实验目的1.学习子程序的定义和调试方法。
2.掌握子程序、子程序的嵌套、递归子程序的结构;3.掌握子程序的程序设计及调试方法。
二、实验设备PC 机一台,TD-PITE 实验装置一套。
三、实验内容及步骤1.求无符号字节序列中的最大值和最小值设有一字节序列,其存储首地址为3000H,字节数为08H。
利用子程序的方法编程求出该序列中的最大值和最小值。
程序流程图如图4-1所示。
图4-1 程序流程图实验程序SSTACK SEGMENT STACKDW 64 DUP(?)SSTACK ENDSCODE SEGMENTASSUME CS:CODESTART: MOV AX, 0000HMOV DS, AXMOV SI, 3000H ; 数据区首址MOV CX, 0008HCALL BRANCH ; 调用子程序HERE: JMP HEREBRANCH PROC NEARJCXZ A4PUSH SIPUSH CXPUSH BXMOV BH, [SI]MOV BL, BHCLDA1: LODSBCMP AL, BHJBE A2MOV BH, ALJMP A3A2: CMP AL, BLJAE A3MOV BL, ALA3: LOOP A1MOV AX, BXPOP BXPOP CXPOP SIA4: RETBRANCH ENDPCODE ENDSEND START实验步骤:(1)根据程序流程图编写实验程序;(2)经编译、链接无误后装入系统;(3)键入E3000命令,输入8个字节的数据,如:D9 07 8B C5 EB 04 9D F9;(4)运行实验程序;(5)点击停止按钮,停止程序运行,观察寄存器窗口中AX的值,AX应为F9 04,其中AH中为最大值,AL中为最小值;(6)反复测试几组数据,检验程序的正确性。
程序说明:该程序使用BH和BL暂存现行的最大值和最小值,开始时初始化成首字节的内容,然后进入循环操作,从字节序列中逐个取出一个字节的内容与BH和BL相比较,若取出的字节内容比BH的内容大或比BL的内容小,则修改之。
蔡宇航实验报告——子程序设计

实验六 子程序设计课程名称:实验项目名称: 实验时间:班级: 姓名: 学号: 实 验 目 的:掌握程序设计中的子程序的设计实 验 环 境:WIN7 MASM 轻松汇编实 验 内 容 及 过 程:编程实现:已知数据段定义如下:data segmentx dw 12y dw 34w dw ?data endsx,y,w 为16位有符号数。
(1) 编写一个子程序add1实现x+y w,并把w 以十进制的形式在屏幕上打印出来。
(2) 编写一个子程序sub1实现x-y w,并把w 以十进制的形式在屏幕上打印出来。
(3) 编写一个子程序mul1实现x*y w,并把w 以十进制的形式在屏幕上打印出来。
(4) 编写一个子程序div1实现x/y w,并把w 以十进制的形式在屏幕上打印出来。
(5) 通过在主程序中调用各子程序来实现对子程序的调试。
实 验 结 果 及 分 析:用 -u 反汇编 查看代码和所处的位置用 -g 命令跳转到偏移地址喂 003c 处成 绩:指导教师(签名):12+34=46 12-34=-22 12*34=408 12/34=0(相当于整型数据相除,被除数<除数,则商为零)实验心得:必须正确的使用跳转命令不然会造成意想不到后果,还有就是用轻松汇编编译可以减去代码排版缩进的麻烦,之前是用uedit 编写,排版缩进不当,很容易把自己搞晕!附录:DA TA SEGMENTX DW 12Y DW 34W DW ?ARRAY DB 100,10,1DA TA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DA TASTART:PUSH DSXOR AX,AXPUSH AXMOV AX,DA TAMOV DS,AXMOV AX,XMOV BX,YCALL ADD1MOV W,CXCALL PRINTCALL SUB1MOV W,CXCALL PRINTCALL MUL1MOV W,CXCALL PRINTCALL DIV1MOV W,CXCALL PRINTMOV AH,01INT 21HRETADD1 PROC NEARPUSH AXPUSH BXADD AX,BXMOV CX,AXPOP BXPOP AXRETADD1 ENDPSUB1 PROC NEARPUSH AXPUSH BXSUB AX,BXMOV CX,AXPOP BXPOP AXRETSUB1 ENDPMUL1 PROC NEARPUSH AXPUSH BXMUL BXMOV CX,AXPOP BXPOP AXRETMUL1 ENDPDIV1 PROC NEARPUSH AXPUSH BXMOV DX,0DIV BXMOV CX,AXPOP BXPOP AXRETDIV1 ENDPPRINT PROC NEARPUSH AXPUSH BXMOV CX,WCMP CH,0FFHJNE ROTA TEMOV DL,2DHMOV AH,02INT 21HNEG CXROTA TE: MOV AX,CXMOV SI,0MOV CX,3ROTATE1: MOV BH,ARRAY[SI]DIV BHMOV BL,AHADD AL,30HMOV DL,ALMOV AH,02INT 21HMOV AL,BLMOV AH,0INC SILOOP ROTATE1MOV DL,20HMOV AH,02INT 21HPOP BXPOP AXRETPRINT ENDPMAIN ENDPCODE ENDSEND START。
微机原理与应用:第十九讲 汇编语言子程序设计方法

CJNE A,
#10, COMP; 累加器的内容与10比较。
COMP: JC
DONE;
若原ASCII码在30H~39H范围内,
;转换完毕,转入DONE处执行程序。
SUBB A,
#7;
若原ASCII码在41H~46H范围内,
;累加器内容再减7。
DONE: POP PSW;
转换完毕,恢复现场。
RET;
子程序返回。
3
子程序安全性举例
MAIN: LOOP:
MULTY:
ORG MOV MOV CLR MOV ACALL ADD INC DJNZ SJMP MOV ADD MOV RET
0100H R0, R6, A 40H, MULTY A, R0 R6, $ A, A, 40H,
#30H #3
@R0
40H
LOOP
12
根据流程图,程序编制如下
;ASCII码转换成十六进制数代码子程序 ;入口参数:子程序名AHC,需转换的ASCII码放在累加器A中。 ;出口参数:转换好的十六进制数放在累加器A中。
AHC: PUSH PSW;
保护现场。
CLR C;
Cy清0。
SUBB A,
#30H; 累加器中的ASCII码减去30H。
来的寄存器和存储器,这叫恢复现场。 最后用返回指令(RET)将程序返回至调用程序。
5
保护现场法举例
改写上个例子中的子程序。
MULTY: PUSH ACC
MOV A,
40H
ADD A,
40H
MOV 40H, A
POP ACC
RET
6
将ACC的内容压 入堆栈保护起来。
将ACC的内容弹 出堆栈,予以恢复。
实验的四子程序设计

实验四子程序设计一.实验目的:1.进一步掌握子程序设计方法;2.进一步掌握基本的DOS 功能调用.二.实验内容:1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.2.统计检查每个学生的名次.3.将统计结果在屏幕上显示.4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.5.输入要有检错手段.三、创新功能:1、监测不合法输入,当输入字符不为数字时,报错'Input illegal!'。
且允许用户从将当前错误数据重新输入,不必整体重新输入。
2、根据实际情况按百分制换算,当输入为3位数时自动结束读取,且最高分可限定为100分,例如输入999,排名时按照100分计算。
3、允许相同成绩的同学存在,不会影响排名。
4、允许输入的学生数任意,只要不超过堆栈空间均可。
5、输入输出界面友好,用户可以直观地看到名次表,对应学生学号和成绩。
6、利用堆栈空间,存储结构优越7、程序采用模块化设计,将实现相同功能的代码聚为宏块或子函数四.预习题:1.如何确定一个学生在这门科目中的名次?答:对成绩降序排序,同时记录学号2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:每次查找出当前最小成绩和其所对应学号入栈,这样形成的栈栈顶为最高分,弹栈时可依次降序输出成绩和对应学号,即为名次表。
3.准备好模块层次图.答:见下面流程图4.给出输出显示的形式.按顺序输入12个学生成绩:100、67、88、89、93、50、6、21、77、77、56、95,按ctrl+z 输入结束运行结果为:五、代码分析CHG MACRO X;将数字转换成ASCII码的宏块PUSH AXPUSH BXMOV AX,XMOV BL,10DIV BLADD AL,'0'ADD AH,'0'MOV BH,ALMOV BL,AHMOV X,BXPOP BXPOP AXENDMPRESENT MACRO X;显示单个字符的宏块MOV AH,02HMOV DL,XINT 21HENDMSTR MACRO STRING;显示字符串宏块MOV AH,09HMOV DX,SEG STRINGMOV DS,DXLEA DX,STRINGINT 21HENDMINPUT MACRO;输入单个字符宏块MOV AH,01HINT 21HENDMDATA SEGMENTBUFF DB 100 DUP(0);存入输入数据STRING1 DB 0DH,'Input illegal!','$' STRING2 DB 'score of stu ','$'STRING3 DB '100','$'STRING4 DB 'NO.','$'STRING5 DB 'The final rank is:','$' STRING6 DB ' STU:','$'STRING7 DB ' SCORE:','$'NUM DW 1;存入学生人数NUM2 DW 1P DW 1COUNT DB 0;计数成绩位数COUNT1 DW 1DATA ENDSSTACK SEGMENT 'STACK'DB 300 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACK START: MOV DX,SEG DATAMOV DS,DXLEA SI,BUFF;输入模块LOOP1: MOV BH,'0'MOV BL,'0'STR STRING2MOV CX,NUM;移入CX进行转换显示CHG CX;将当前学号变为ASCIIPRESENT CHPRESENT CLPRESENT ':'L3: INPUTCMP AL,26;输入是否结束JZ EXICMP AL,0DHJNZ L1L2: INC NUM;输入结束CMP COUNT,1JZ Y1MOV [SI],BH;存成绩!!!!!!!!!MOV [SI+1],BLJMP Y2Y1: MOV BYTE PTR [SI],'0';当输入为一位数时,高位写0 MOV [SI+1],BHY2: INC SIINC SIMOV COUNT,0;计数变量清零PRESENT 0DHPRESENT 0AHJMP LOOP1L1: CALL JUDGECMP DL,0JNZ LOOP1;不合法重新输入INC COUNT;合法代表已经输入了一位数CMP COUNT,1JNZ CNT2MOV BH,AL;输入第一位数JMP L3CNT2: CMP COUNT,2;输入第二位数JNZ CNT3MOV BL,ALJMP L3CNT3: MOV BH,40HMOV BL,40HJMP L2;输入三位数代表当前输入结束;排序模块EXI: DEC NUMMOV AX,NUMMOV NUM2,AX;存起来NUM输入的个数LEA SI,BUFFMOV BH,40H;最小数MOV BL,40HMOV DX,NUM;待比较的数的个数LOOP2: CMP NUM,0JZ WALILOOP3: MOV CL,[SI];当前待比较单元送人SICMP CL,'!';是否为空单元JZ PLUSS;是则判断下一个CMP CL,BH;判断高位JA PLUSS;大于最小数,跳转判断下一个JB IMOV CL,[SI+1];判断低位CMP CL,BLJA PLUSS;大于最小数,跳转判断下一个I: MOV BH,[SI];更新最小值MOV BL,[SI+1]MOV DI,SI;存最小值的指针PLUSS: INC SI;判断下一个数INC SIDEC DX;还剩DX个数需要比较CMP DX,0JNZ LOOP3PUSH BX;跳出循环一轮比较完毕LEA SI,BUFF;SI重新指向待比较的数组首位PUSH CXMOV CX,DISUB DI,SI;记录最小值是第几个学生MOV AX,DI;存下二者差值MOV BL,2DIV BL;得到实际的学号偏移MOV DI,CXPOP CXMOV P,AXINC PCHG P;将学号转换为ASCII码入栈PUSH P;学号入栈MOV BYTE PTR [DI],'!';入栈后相应位置置入特殊符号,下次读取到此符号可不进行判断MOV BYTE PTR [DI+1],'!'DEC NUM;待入栈的变量-1MOV DX,NUM2MOV BH,40H;保证每次寻找最小值前BH、BL中内容为最大值MOV BL,40HJMP LOOP2;显示模块WALI: PRESENT 0DHSTR STRING5PRESENT 0DHPRESENT 0AHAGAIN: MOV CX,NUM2CMP CX,0;是否栈空JNZ GOONENDD: MOV AX,4C00HINT 21HGOON: STR STRING4MOV CX,COUNT1CHG CXPRESENT CHPRESENT CLPRESENT ':'POP CX;学号弹栈STR STRING6PRESENT CH;输出学号PRESENT CLPRESENT 20HSTR STRING6POP CX;成绩弹栈STR STRING7CMP CH,40H;是否是满分JZ NEAR PTR FULPRESENT CH;非满分显示分数的高低位PRESENT CLLINE: PRESENT 0DHPRESENT 0AHDEC NUM2INC COUNT1JMP AGAINFUL: PRESENT '1';满分直接显示100PRESENT '0'PRESENT '0'JMP LINEJUDGE PROC;判断输入是否合法,合法则DL=0不合法修改DL=1且输出字符串提示MOV DL,0CMP AL,'0'JNB NEXT1W1: STR STRING1MOV DL,1JMP OVNEXT1: CMP AL,'9'JA W1OV: RETJUDGE ENDPCODE ENDSEND START23、输出模块流程图:七、程序设计思路与总结本实验主要联系了宏块和子程序调用,属于排序问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机实验三分支和循环程序设计实验一、分支程序设计实验1.实验目的1.掌握分支程序的结构。
2掌握分支程序的设计、调试方法。
2.实验设备微机一台3.内容设计一数据块间的搬移程序设计思想:程序要求把内存中一数据区(称为源数据块)传送到另一存贮区(称为目的数据块)。
源数据块和目的数据块在存贮中可能有三种情况。
对于两个数据块分离的情况,数据的传送从数据块的首址开始,或者从数据块的末址开始均可,但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。
可以得出以下结论:当源数据块首址〉目的块首址时,从数据块首址开始传送数据。
当源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
流程图:结果:在源数据块中存入6个数,分别使SI大于、等于、小于DI均发觉数据正确传送。
可见程序正确。
实现代码如下:DATA SEGMENTORG 3500HSRC_MESS DB 1,2,3,4,5,6ORG 3510HNEW_LOC DB 20 DUP(0)DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,SRC_MESSLEA DI,NEW_LOCMOV CX,6CLD ;DF置0CMP SI,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2) NEXT2: REP MOVSBNEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据DEC SI ;ADD DI,CX ;DI+=DI+CX-1DEC DI ;STD ; DF置1JMP NEXT2 ;CODE ENDSEND START结果显示:将3500H开始的1,2,3,4,5,6复制到3510H开始的地址。
DATA SEGMENTORG 3500HSRC_MESS DB 1,2,3,4,5,6DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART:MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,SRC_MESSMOV DI,3502HMOV CX,6CLD ;DF置0CMP S I,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2)NEXT2: REP MOVSBMOV AH,4CHINT 21HNEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据DEC SI ;ADD DI,CX ;DI+=DI+CX-1DEC DI ;STD ; DF置1JMP NEXT2 ;CODE ENDSEND START结果显示:将3500H开始的连续的1,2,3,4,5,6复制搬移到3502H开始的地址。
此时,搬移过程应当从数组的最后一个数字6开始搬移,一直到最前面的3500H对应的的数字01搬移到3502H地址为止。
DATA SEGMENTORG 3502HSRC_MESS DB 1,2,3,4,5,6DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART:MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,SRC_MESSMOV DI,3500HMOV CX,6CLD ;DF置0CMP S I,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2)NEXT2: REP MOVSBMOV AH,4CHINT 21HNEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据DEC SI ;ADD DI,CX ;DI+=DI+CX-1DEC DI ;STD ; DF置1JMP NEXT2 ;CODE ENDSEND START结果显示:将3502H开始的1,2,3,4,5,6搬移到3500H开始的地址,应该从3502H地址开始传数据到3500H,依次往后搬移。
二、循环程序设计实验1.实验目的(1)加深对循环结构的理解。
(2)掌握循环结构程序设计的方法。
(3)熟练掌握调试循环程序的方法。
2.实验设备TDS-MD微机一台3.内容(1)编制程序使S=1+2*3+3*4+4*5+……N(N+1),直到N(N+1)项大于200为止。
流程图:实现代码:DATA SEGMENTORG 3500HHELLO DB 32 DUP(0)DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DX,1 ;DX存储总和MOV BL,2 ;BL存储被乘项NEXT: MOV AL,BL; AL存储被乘项INC BL ;MUL BL ; 结果存储在AXADD DX,AXCMP AX,200JL NEXTMOV BX,3500HMOV [BX],DXMOV BX,3510HMOV [BX],AXMOV AH,4CHINT 21HCODE ENDSEND START结果与分析:运行结果为045FH,与实际相符,程序正确。
(2)求某个数据区内负数的个数设数据区的第一单元存放区内数据的个数,从第二单元开始存放数据,在区内最后一个单元存放结果。
为统计数据区内负数的个数,需要逐个判断区内的每一个数据,然后将所有数据中凡是符号位为1的数据的个数累加起来,即得区内所包含负数的个数。
流程图:实现代码:DATA SEGMENTORG 3500HHELLO DB 6,3,-58,-34,7,-2,29 ;6是数据的个数,共有6个数据ORG 3510HNUM_T DB 16 DUP(0) ;3510H单元存结果DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA ;初始化数据段MOV DS,AXMOV DI,3500H ;数据区的首地址给DIMOV CL,[DI] ;数据的个数给CL,作为NEXT1循环的个数INC DI ;DI指向第一个需要比较的数据MOV CH,0MOV BL,0NEXT1: MOV AL,[DI]AND AL,80H ;AL与1000(B)做按位与操作,如果是负数,AL存储的是1000(B),否则存储的是0CMP AL,80H ;如果是负数,AL与80H相等JE NEXT2 ;如果是负数,跳转到NEXT2GOGO: INC DILOOP NEXT1MOV DI,3510HMOV [DI],BLMOV AX,4C00H ;返回DOSINT 21HNEXT2: INC BLJMP GOGOCODE ENDSEND START结果与分析:输入数据个数为6输入3,-58,-34,7,-2,29得结果03,存放在3510H地址。
其中3500H地址对应的数字6是原始数据的个数。
结果与实际相符,程序正确。
输入数据个数为6输入3,-58,-34,7,-2,-29得结果04,存放在3510H地址。
其中3500H地址对应的数字6是原始数据的个数。
结果与实际相符,程序正确。
实验四子程序设计一.实验目的1、学习子程序的定义和调用方法。
2、掌握子程序、子程序嵌套的结构。
3、掌握子程序的程序设计、编制及调试方法。
二.实验内容程序采用菜单式选择,可接收用户输入的命令(1~5),各命令如下:按1键完成字符串小写字母变大写字母用户输入一由英文大小写字母或数字0~9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其它字符不变,并在屏幕上显示。
用户按任一键,重做,按ESC键,返回主菜单。
按2键完成找最大值(二选一)1、接收用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来。
2、接收用户输入若干无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按3键完成排序(二选一)1、接收用户输入的可显示字符串,以回车结束。
程序按ASCII码值大小由大到小排序并输出显示。
2、接收用户输入若干个有符号8位数(以空格逗号为分隔符,以回车结束)。
程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按4键显示时间首先提示用户对时,即用户输入时,分,秒(以空格或冒号分隔,以回车结束),然后,在屏幕上不断显示时间,格式为:××(时):××(分):××(秒),最好定点显示。
用户按任一键,重新对时,按ESC键,返回主菜单。
按5键,结束程序运行,返回系统提示符。
三.程序与流程图主程序的简略流程子程序一的简略流程图子程序二的简略流程图子程序三的简略流程图子程序4,显示时间流程图实现代码:DATA SEGMENTORG 3500HBUF DB 100 ;从3500H开始定义缓冲区DB ?DB 100 DUP(0)MYNAME DB 'Programed by ali ...',0DH,0AH,'$'BUF1 DB '1. Input a string,then convert the small letter to big letter.',0DH,0AH,'$' BUF2 DB '2. Find the character whose ASCII code is biggest.',0DH,0AH,'$'BUF3 DB '3. Sort the character by ASCII code by decreasing order .',0DH,0AH,'$' BUF4 DB '4. Display the ticking time.',0DH,0AH,'$'BUF5 DB '5. End the program.',0DH,0AH,'$'STRING1 DB 'Please input a string:',0DH,0AH,'$'STRING2 DB 'Enter any character to play again or Esc to quit...',0DH,0AH,'$' STRING3 DB 0DH,0AH,'$'DATA E NDS;CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV A X,DATA ;DATA初始化MOV D S,AXHELLO: CALL CHILD0 ;显示菜单MOV A X,0100H ;从键盘输入一个数字的ASCII,AL存储输入的数字的ASCII INT 21HCMP AL,31HJE NEXT1CMP AL,32HJE NEXT2CMP AL,33HJE NEXT3; CMP AL,34H; JE NEXT4CMP AL,35HJE NEXT5NEXT1: CALL CHILD1JMP HELLONEXT2: CALL CHILD2JMP HELLONEXT3: CALL CHILD3JMP H ELLO;NEXT4: CALL CHILD4; JMP H ELLONEXT5: CALL CHILD5;显示菜单子程序CHILD0 PROC NEARMOV D X,OFFSET MYNAMEMOV A H,9H ;显示INT 21HMOV DX,OFFSET BUF1MOV A H,9H ;显示INT 21HMOV DX,OFFSET BUF2MOV A H,9H ;显示INT 21HMOV DX,OFFSET BUF3MOV A H,9H ;显示INT 21HMOV DX,OFFSET BUF4MOV A H,9H ;显示INT 21HMOV DX,OFFSET BUF5MOV A H,9H ;显示INT 21HRETCHILD0 ENDP;CHILD1 PROC NEARHELLO_1:MOV DX,OFFSET STRING1 MOV A H,9HINT 21HLEA DX,BUFMOV AH,10INT 21HMOV D X,OFFSET STRING3 ;换行MOV A H,9HINT 21HMOV B X,3501HMOV C L,[BX]MOV C H,0MOV B X,3502HNEXT1_1: MOV A L,[BX]CMP AL,97JL DADACMP AL,122JG DADASUB AL,32 ;是小写字符DADA: MOV D L,ALMOV A H,02HINT 21HINC BXLOOP NEXT1_1MOV D X,OFFSET STRING3 ;换行MOV A H,9HINT 21HMOV D X,OFFSET STRING2MOV A H,9HINT 21HMOV A H,08HINT 21HCMP AL,27 ;跟ESC的ASCII比较JE BYBYJMP HELLO_1BYBY: RETCHILD1 ENDP;CHILD2 PROC NEARMOV D X,OFFSET STRING1MOV A H,9HINT 21HLEA DX,BUFMOV AH,10INT 21HMOV DI,3501HMOV CL,[DI]DEC CL ;循环次数MOV CH,0LOOP1:MOV DX,CXMOV B X,3502HLOOP2:MOV AL,[BX]CMP AL,[BX+1]JAE NO_CHANGEXCHG AL,[BX+1]MOV [BX],ALNO_CHANGE:ADD BX,1LOOP LOOP2MOV C X,DXLOOP LOOP1MOV D X,OFFSET STRING3 MOV A H,9HINT 21HMOV DI,3502HMOV DL,[DI]MOV AH,02HINT 21HMOV D X,OFFSET STRING3 ;换行MOV A H,9HINT 21HRETCHILD2 ENDPCHILD3 PROC NEARMOV D X,OFFSET STRING1MOV A H,9HINT 21HLEA DX,BUFMOV AH,10INT 21HMOV DI,3501HMOV CL,[DI]DEC CL ;循环次数MOV CH,0LOOP11:MOV DX,CXMOV B X,3502HLOOP22:MOV AL,[BX]CMP AL,[BX+1]JAE NO_CHANGE1XCHG AL,[BX+1]MOV [BX],ALNO_CHANGE1:ADD BX,1LOOP LOOP22MOV C X,DXLOOP LOOP11MOV DX,OFFSET STRING3MOV A H,9HINT 21HMOV CH,0MOV BX,3501HMOV CL,[BX]MOV DI,3502HPETER:MOV DL,[DI]MOV AH,02HINT 21HINC DILOOP PETERMOV D X,OFFSET STRING3 ;换行MOV A H,9HINT 21HRETCHILD3 ENDP;返回DOSCHILD5 PROC NEARMOV A X,4C00HINT 21HRETCHILD5 ENDPCODE ENDSEND START结果显示:选择1号功能,输入字符串,将字符串转换成大写形式,并显示到屏幕上。