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

实验三子程序设计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位会直接把正常的数字字符冲掉,还有就是将当我直接将字型单元的内容传送字型单元时,编译器会报错,不过提示是它后面的指令错误。
- 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号功能,输入字符串,将字符串转换成大写形式,并显示到屏幕上。