8086微机原理实验之五个字从大到小排序

合集下载

微机原理课程设计报告大小写字母转换

微机原理课程设计报告大小写字母转换

目录摘要 (I)Abstract (II)1 原理 (1)1.18086的内部结构 (1)1.28086的指令系统 (2)1.3汇编语言程序设计 (6)1.4报警声音生成 (7)2程序设计 (9)2.1程序设计流程图 (9)2.2程序代码 (10)2.3运行结果分析 (13)3心得体会 (14)参考文献 (15)摘要在课程设计之前,具备微机原理的理论知识和实践能力;熟悉汇编语言编程技术;熟悉80X86的CPU结构和指令系统;熟悉相关常用接口电路的设计使用方法是必不可少的。

因此原理部分重新温习并整理了相关知识。

课程设计要求进行大小写字母的转换。

其实字母大小写的区别在于他们的ASCII码范围,它们之间的转换其实就是加减相应的ASCII码值。

在判断输入的字母是大写的还是小写的(即判断输入符号ASCII码在41H~5AH还是在61H~7AH内)之后,决定判断是加上还是减去ASCII码值。

另外如果输入的不是字母(输入字符对应ASCII码值不在41H~5AH或61H~7AH 内),则需要报警提示,这不但涉及到用汇编语言实现发声的方法,而且对计算机硬件的了解也有要求,因此原理部分加入了部分有关声音产生的硬件知识。

AbstractPrior to the course design, computer principles with theoretical knowledge and practical ability; familiar with assembly language programming techniques; familiar with the 80X86 the CPU architecture and instruction; familiar with the use of common interface circuit design is essential. Therefore, some re-principle study and collate the relevant knowledge.Curriculum design, uppercase and lowercase letters requested conversion. In fact, the difference between the case of letters lies in their ASCII code range, the conversion between them is actually plus or minus the value of the corresponding ASCII code. In determining the input is uppercase or lowercase letters (that is to determine input symbols in the ASCII code 41H ~ 5AH or 61H ~ 7AH inside), the decision to determine a plus or minus the value of ASCII code. Also, if not the letter of the input (input characters corresponding to ASCII code value is not 41H ~ 5AH or 61H ~ 7AH inside), you need to alarm, not only related to using assembly language to achieve sound approach,But also have knowledge of computer hardware requirements, thus adding some of the principles of some of the sound generated by the hardware knowledge.1 原理1.1 8086的内部结构80x86从功能上分执行单元EU(Execution Unit),和总线接口单元BIU(Bus Interface Unit),执行单元由算术逻辑单元(ALU)、标志寄存器、通用寄存器组和EU控制器等部件组成。

微机原理-8086指令系统

微机原理-8086指令系统
17
SHR OR MOV INC INC POP DEC JNZ INT
AL,CL AL,30H [DI],AL DI SI CX CX BBB 20H
;逻辑右移4位 逻辑右移4 ;得高4位ASCII码 1000H 得高4 ASCII码 ;存ASCII码 ASCII码 ;DI加1 DI加 ;SI加1 SI加 3000H ;恢复CX 恢复CX ;(CX)←(CX)-1 (CX)←(CX);(CX)=0? 否转 ;是,结束
8
2。 移位指令
(1)非循环移位指令 8086/8088 CPU有4条非循环移位指令: CPU有 算术左移指令SAL 逻辑左移指令SHL 算术左移指令SAL 逻辑左移指令SHL 算术右移指令SAR 逻辑右移指令SHR 算术右移指令SAR 逻辑右移指令SHR 这4条指令的格式相同,以SAL为例: 条指令的格式相同, SAL为例: SAL mem/reg,count 式中变量count表示移位数,其值或是1 式中变量count表示移位数,其值或是1,或是 CL寄存器包含的数值。 CL寄存器包含的数值。
只需13个 状态时间。 只需13个T状态时间。
15
下面看一个实例来说明逻辑运算指令和移 下面看一个实例来说明逻辑运算指令和移 位指令的使用: 位指令的使用: BCD码 ASCII码 BCD码→ASCII码 设在1000H开始存有四个组合的BCD码12、 设在1000H开始存有四个组合的BCD码12、 34、56、78要求转换为ASCII码存放在3000H 34、56、78要求转换为ASCII码存放在3000H 开始的单元中去。 程序段如下:
OR指令对两个指定的操作数,按位进行 OR指令对两个指定的操作数,按位进行 逻辑” 逻辑”或” 例:OR 例:OR AL,80H ;AL与立即数”或” AL与立即数” OR BX,DI ;BX与DI相”或” BX与DI相 为了将AL中的未组合的BCD码 为了将AL中的未组合的BCD码变成相应 十进制数的ASCII码 十进制数的ASCII码,可用如下指令: OR AL,30H “或”指令对标志位的影响同AND指令. 指令对标志位的影响同AND指令. 思考题:键入的大写字母→小写字母? 思考题:键入的大写字母→小写字母?

微机原理实验报告-冒泡排序

微机原理实验报告-冒泡排序

一、实验目的(1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。

(2)理解并掌握各种指令的功能,编写完整的汇编源程序。

(3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。

二、实验内容及要求(1)实验内容:从键盘输入五个有符号数,用冒泡排序法将其按从小到大的顺序排序。

(2)实验要求:①编制程序,对这组数进行排序并输出原数据及排序后的数据;②利用DEBUG调试工具,用D0命令,查看排序前后内存数据的变化;③去掉最大值和最小值,求出其余值的平均值,输出最大值、最小值和平均值;④用压栈PUSH和出栈POP指令,将平均值按位逐个输出;⑤将平均值转化为二进制串,并将这组二进制串输出;⑥所有数据输出前要用字符串的输出指令进行输出提示,所有数据结果能清晰显示。

三、程序流程图(1)主程序:MAIN是(2)冒泡排序子程序: SORT否是是四、程序清单NAME BUBBLE_SORTDATA SEGMENTARRAY DW 5 DUP() ;输入数据的存储单元COUNT DW 5TWO DW 2FLAG1 DW 0 ;判断符号标志FLAG2 DB 0 ;判断首位是否为零的标志FAULT DW -1 ;判断出错标志CR DB 0DH,0AH,'$'STR1 DB 'Please input five numbers seperated with space and finished with Enter:','$'STR2 DB 'The original numbers:','$'STR3 DB 'The sorted numbers:','$'STR4 DB 'The Min:','$'STR5 DB 'The Max:','$'STR6 DB 'The Average:','$'STR7 DB 'The binary system of the average :','$'STR8 DB 'Input error!Please input again!''$'DATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATA,ES:DATASTART: PUSH DSAND AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA DX,STR1MOV AH,09H ;9号DOS功能调用,提示输入数据INT 21HCALL CRLF ;回车换行REIN: CALL INPUT ;调用INPUT子程序,输入原始数据CMP AX,FAULT ;判断是否出错,JE REIN ;出错则重新输入LEA DX,STR2MOV AH,09H ;9号DOS功能调用,提示输出原始数据INT 21HCALL OUTPUT ;调用OUTPUT子程序,输出原始数据CALL SORT ;调用SORT子程序,进行冒泡排序LEA DX,STR3MOV AH,09H ;9号DOS功能调用,提示输出排序后的数据 INT 21HCALL OUTPUT ;调用OUTPUT子程序,输出排序后的数据AND SI,0AND BX,0MOV BX,ARRAY[SI] ;将最小值存入BXLEA DX,STR4MOV AH,09H ;9号DOS功能调用,提示输出数据的最小值INT 21HCALL ONE ;调用ONE子程序,输出最小值CALL CRLFLEA DX,STR5MOV AH,09H ;9号DOS功能调用,提示输出排序后的最大值INT 21HMOV BX,ARRAY[SI+8] ;将最大值存入BXCALL ONE ;调用ONE子程序,输出最大值CALL CRLFLEA DX,STR6MOV AH,09H ;9号DOS功能调用,提示输出平均值INT 21HAND DX,0MOV AX,ARRAY[SI+2] ;将去掉最大最小值的其余各数之和存入AXADD AX,ARRAY[SI+4]ADC AX,ARRAY[SI+6]MOV CX,COUNT ;计数器CX=5DEC CX ;CX←CX-1DEC CXDIV CX ;字除法,余数存入AXMOV BX,AX ;将余下各数的平均值存入BXCALL ONE ;调用ONE子程序,输出去掉最大最小值的其余数平均值 CALL CRLFLEA DX,STR6MOV AH,09H ;9号DOS功能调用,提示输出平均值的二进制串MOV CX,16 ;16位二进制串,计数器初始值为16LL1: AND DX,0DIV TWOPUSH DXLOOP LL1MOV CX,16LL2: POP DXADD DL,30H ;将DL中的数进行ASCII码转换MOV AH,2 ;2号DOS功能调用,输出字符“0”或“1”INT 21HLOOP LL2MOV AH,4CHINT 21H ;4C号功能调用,返回DOSMAIN ENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:CRLF功能:回车和换行;--------------------------------------------------------------------------------------------------------------------------------CRLF PROCLEA DX,CRMOV AH,09HINT 21HRETCRLF ENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:INPUT功能:输入一组数据;--------------------------------------------------------------------------------------------------------------------------------INPUT PROCMOV CX,COUNT ;计数器CX=5AND SI,0NEXT1: CALL DTB ;调用DTB子程序,将输入转换为二进制数DEC CX ;CX←CX-1CMP DL,20H ;判断输入字符是否为空格符JE STOCMP DL,0DH ;判断输入字符是否为换行符JE EXIT2CALL CRLFERROR: LEA DX,STR8MOV AH,09H ;9号DOS功能调用,提示输入不合法INT 21HCALL CRLFMOV AX,FAULT ;以AX中的值作为出错标志JMP EXIT3STO: MOV ARRAY[SI],BX ;是空格符,将BX中的二进制数存入存储单元ADD SI,2JMP NEXT1EXIT2: MOV ARRAY[SI],BX ;是换行符,将BX中的二进制数存入存储单元CALL CRLFEXIT3: RETINPUT ENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:DTB功能:将键盘输入的十进制数转换为二进制数形式存入BX;--------------------------------------------------------------------------------------------------------------------------------DTB PROCAND BX,0AND FLAG1,0 ;符号标志,0为正,1为负CHAR: MOV AH,01H ;1号DOS功能调用,输入一个字符,存入ALINT 21HMOV DL,ALCMP AL,2DH ;判断输入字符是否为负号"-"JNZ NEXT2MOV FLAG1,1 ;是负数,将符号标志FLAG1置1JMP CHARNEXT2: SUB AL,30H ;判断输入字符是否在0-9之间JL NEXT3CMP AL,09HJG NEXT3CBWXCHG AX,BX ;输入字符在0-9之间,将BX中的数乘以10MOV CX,10MUL CXXCHG AX,BXADD BX,AX ;将BX中的数与新输入的数相加JMP CHARNEXT3: CMP FLAG1,1 ;根据符号标志判断输入是否为负JNZ EXIT1NEG BX ;对BX中的数求补EXIT1: RETDTB ENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:OUTPUT功能:输出一组数据;--------------------------------------------------------------------------------------------------------------------------------OUTPUT PROCMOV DI,COUNT ;计数器DI=5AND SI,0GO1: MOV BX,ARRAY[SI] ;将存储单元的第一组数据存入BXTEST BX,8000H ;判断正负JZ GO2MOV DL,2DHMOV AH,02H ;2号DOS功能调用,输出负号"-"INT 21HNEG BXGO2: CALL ONE ;调用ONE子程序,将BX中二进制数转换为十进制数输出 MOV DL,20HMOV AH,02H ;2号DOS功能调用,输出空格符INT 21HADD SI,2 ;指针指向下一数据DEC DI ;DI←DI-1JNZ GO1 ;计数器DI不为零,继续循环CALL CRLFRETOUTPUT ENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:ONE功能:将BX中的的二进制数转换为十进制数,由高到低各位依次输出;--------------------------------------------------------------------------------------------------------------------------------ONE PROCPUSH CXPUSH SIPUSH DIMOV CX,10000 ;除数存入CXCALL BTDMOV CX,1000CALL BTDMOV CX,100CALL BTDMOV CX,10CALL BTDMOV CX,1CALL BTDADD DL,FLAG2CMP DL,30H ;与"0"的ASCII码比较,判断该数是否为"0"JNE QUIT3MOV AH,02H ;2号DOS功能调用,输出"0"INT 21HQUIT3: POP DIPOP SIPOP CXPOP BXAND FLAG2,0 ;将首位标志FLAG2重新置0RETONE ENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:BTD功能:将BX中的二进制数转换为一个十进制数输出;--------------------------------------------------------------------------------------------------------------------------------BTD PROCMOV AX,BXAND DX,0DIV CX ;字除法,商值存入AX,余数存入DXMOV BX,DX ;余数存入BXMOV DL,ALADD DL,30H ;对DL中的数进行ASCII码转换CMP FLAG2,0 ;判断是否为首位数据JNE QUIT1CMP DL,30H ;是首位则判断是否为"0"JE QUIT2 ;是"0"则不输出MOV FLAG2,1 ;不是"0"将首位标志置1QUIT1: MOV AH,02H ;2号DOS功能调用,输出一位十进制数INT 21HQUIT2: RETBTD ENDP;--------------------------------------------------------------------------------------------------------------------------------子程序:SORT功能:冒泡排序;--------------------------------------------------------------------------------------------------------------------------------SORT PROCCLDMOV CX,COUNT ;初始化计数器CXDEC CX ;CX=4LOO1: MOV DI,CX ;CX中的数存入DIAND SI,0LOO2: MOV AX,ARRAY[SI]CMP AX,ARRAY[SI+2] ;相邻两数进行比较JL LOO3XCHG AX,ARRAY[SI+2] ;前一数较大则进行数据交换MOV ARRAY[SI],AXLOO3: ADD SI,2 ;前一数较小,则进行下一组比较LOOP LOO2 ;CX=0,停止内循环MOV CX,DI ;还原计数器CX的值LOOP LOO1 ;CX=0,停止外循环RETSORT ENDP;--------------------------------------------------------------------------------------------------------------------------------CODE ENDSEND START五、运行结果(1)对300,250,280,240,260五个数进行冒泡排序,运行结果如下:(2)对-1,2,54,-38,43五个数进行冒泡排序,运行结果如下(1)当输入不合法时,出现错误提示:(4)当输入数据不足5个时程序自动补0:六、心得体会在本次汇编语言程序设计实验中,我们学习了汇编语言的循环结构,并对冒泡排序法进行了汇编程序设计,我首先编写了对给定数据进行冒泡排序的算法设计,这有助于我熟悉冒泡排序的逻辑结构,理清设计思路。

《微机原理与接口技术》实验指导书

《微机原理与接口技术》实验指导书

《微机原理与接口技术》课程实验指导书实验内容EL-8086-III微机原理与接口技术教学实验系统简介使用说明及要求✧实验一实验系统及仪器仪表使用与汇编环境✧实验二简单程序设计实验✧实验三存储器读/写实验✧实验四简单I/0口扩展实验✧实验五8259A中断控制器实验✧实验六8253定时器/计数器实验✧实验七8255并行口实验✧实验八DMA实验✧实验九8250串口实验✧实验十A/D实验✧实验十一D/A实验✧实验十二8279显示器接口实验EL-8086-III微机原理与接口技术教学实验系统简介使用说明及要求EL-8086-III微机原理与接口技术教学实验系统是为微机原理与接口技术课程的教学实验而研制的,涵盖了目前流行教材的主要内容,该系统采用开放接口,并配有丰富的软硬件资源,可以形象生动地向学生展示8086及其相关接口的工作原理,其应用领域重点面向教学培训,同时也可作为8086的开发系统使用。

可供大学本科学习《微机原理与接口技术(8086)》,《单片机应用技术》等课程提供基本的实验条件,同时也可供计算机其它课程的教学和培训使用。

为配合使用EL型微机教学实验系统而开发的8086调试软件,可以在WINDOWS 2000/XP等多种操作系统下运行。

在使用本软件系统调试程序时,可以同时打开寄存器窗口、内存窗口、反汇编窗口、波形显示窗口等等,极大地方便了用户的程序调试。

该软件集源程序编辑、编译、链接、调试与一体,每项功能均为汉字下拉菜单,简明易学。

经常使用的功能均备有热键,这样可以提高程序的调试效率。

一、基本特点EL型微机教学实验系统是北京精仪达盛科技有限公司根据广大学者和许多高等院校实验需求,结合电子发展情况而研制的具有开发、应用、实验相结合的高科技实验设备。

旨在尽快提高我国电子科技发展水平,提高实验者的动手能力、分析解决问题能力。

系统具有以下特点:1、系统采用了模块化设计,实验系统功能齐全,涵盖了微机教学实验课程的大部分内容。

基于8086用汇编语言实现的十个有符号数的排序(冒泡排序算法,输入为补码,从小到大)

基于8086用汇编语言实现的十个有符号数的排序(冒泡排序算法,输入为补码,从小到大)

提示:在做实验时,我们要自己将代码区和数据区分开,因为8086上没有软件帮我们完成这个任务。

MOV R0,#218 //之所以选择208这个大点的地址,是因为避免将数据写到了代码区LOOP1:IN //将数据读入AADD A,#128 //将补码转换为其对应的移码,因为补码本身参与加减不能比较出大//小,而移码就是将其真值在数轴上平移了2的n次方MOV @R0,AMOV A,R0sub a,#1SUB A,#208 //判断有没有输入完10个数JZ LOOP2 //输入完数据,跳转ADD A,#208MOV R0,AJMP LOOP1//没有输入完,就跳回接着输入LOOP2:MOV R0,#9 //9轮循环比较就可以排完序MOV R1,#209MOV R2,#210LOOP4:MOV A,@R2SUBC A,@R1JC LOOP3 //若210地址指向的单元中的数比209地址指向的单元中的小,则交//换LOOP5:MOV A,R2ADD A,#1SUBC A,#219 //判断此轮有没有比较完JZ LOOP6 //若比较完,就跳到LOOP6,否则继续比较ADD A,#219MOV R2,AJMP LOOP4LOOP3:MOV A,@R1MOV 208,AMOV A,@R2MOV @R1,AMOV A,208MOV @R2,AJMP LOOP5 //交换完了就跳回LOOP6: MOV A,R1ADD A,#1MOV R1,AADD A,#1MOV R2,A //让R2始终指向的是R1下一个单元MOV A,R0SUB A,#1JZ LOOP7 //判断9轮比较有没有完成,若完成,跳LOOP7,否则,继续比//较MOV R0,AJMP LOOP4LOOP7: MOV R0,#218LOOP9: MOV A,@R0 //下面这一段代码就是将数还原,因为原来我们是那人家的移码//形式来比较的,相信下面这一段就不用多讲了吧ADD A,#128MOV @R0,AMOV A,R0sub a,#1SUB A,#208JZ LOOP8ADD A,#208MOV R0,AJMP LOOP9LOOP8:END。

微机原理课程设计人名排序

微机原理课程设计人名排序

微机原理课程设计人名排序第一篇:微机原理课程设计人名排序人名排序的程序实现;***********************************************************.MODEL SMALL.STACK 40H;***********************************************************.D ATANAMEPAR LABEL BYTE MAXLEN DB 21NAMELEN DB ?NAMEFLD DB 21 DUP(?)CRLF DB 13,10,'$';定义DATA数据段;名字长度,未设初值;定义NAMEFLD为21字节长,未设置初值ENDADDR DW ?;定义ENDADDR类型为字,初值未设定 MESSG1 DB 'Name?','$' ;定义MESSG1为字符串Name? MESSG2 DB 'Sorted name:',13,10,'$';定义MESSG2为字符串Sorted name: NAMECTR DB 0;名字计数器,初始设为0 NAMETAB DB 30 DUP(20 DUP(' '));长度30,每个可存储20字节的字符串NAMESAV DB 20 DUP(?),13,10,'$';这个变量用来暂存名字 SWAPPED DB 0;***********************************************************.CODE;-----------------------------;定义代码段BEGIN PROC FAR;主程序开始MOV AX,@DATA;将DATA地址传给AXMOV DS,AX;将AX值传给DS和ESMOV ES,AXCLD;DF设为0LEA DI,NAMETAB;将NAMETAB的有效地址传给DIA20LOOP:CALL B10READ;调用B10READ子程序,用来接收输入的人名CMP NAMELEN,0;两数比较JZ A30;等于0时,转到A30CMP NAMECTR,30;再将NAMECTR和30进行比较JE A30;若等于30则转移到A30CALL D10STOR;调用子程序D10STOR,存储名字到NAMETAB中JMP A20LOOP;转移到A20LOOP循环,读入名字,直到不输入或计数器到了30为止 A30:CMP NAMECTR,1JBE A40CALL G10SORTCALL K10DISPA40: MOV AX,4C00HINT 21HBEGIN ENDP;-----------------B10READ PROC NEARMOV AH,09LEA DX,MESSG1INT 21HMOV AH,0AHLEA DX,NAMEPARINT 21HMOV AH,09LEA DX,CRLFINT 21HMOV BH,0MOV BL,NAMELENMOV CX,21SUB CX,BXB20: MOV NAMEFLD[BX],20H INC BXLOOP B20RETB10READ ENDP;-----------------D10STOR PROC NEARINC NAMECTRCLDLEA SI,NAMEFLD器SIMOV CX,10;比较;小于或者等于1,转移到A40;调用G10SORT,人名排序;调用K10DISP,显示人名;将值4C00赋值给AX;主程序结束;子程序B10READ;将MESSG1的有效地址传送给DX;显示MESSG1:Name?;将NAMEPAR的有效地址传送给DX;将CRLF的有效地址传送给DX;显示CRLF中的内容(换行);将NAMELET传送给BL;21(16进制里的15);CX-BX并将值返回给CX;BX加1??;循环执行B20;子程序返回;退出;子程序D10STOR;计数器加1;方向标志DF设置为0;将NAMEFLD的有效地址传送给源地址寄存REP MOVSWRETD10STOR ENDP;-----------------G10SORT PROC NEARSUB DI,40MOV ENDADDR,DIG20:MOV SWAPPED,0LEA SI,NAMETABG30 : MOV CX,20MOV DI,SIADD DI,20MOV AX,DIMOV BX,SIREPE CMPSBJBE G40CALL H10XCHGG40:MOV SI,AXCMP SI,ENDADDRJBE G30CMP SWAPPED,0JNZ G20RETG10SORT ENDP;-----------------H10XCHG PROC NEARMOV CX,10LEA DI,NAMESAVMOV SI,BXREP MOVSWMOV CX,10MOV DI,BXREP MOVSWMOV CX,10LEA SI,NAMESAVREP MOVSWMOV SWAPPED,1;重复执行字传送10次串操作MOVSW;子程序返回;退出;子程序G10SORT:冒泡排序的实现;DI减40(16进制里的28);将NAMETAB的有效地址传送给SI;DI加20(即16进制的14);如果CF或ZF等于1则转移到G40??;调用子程序H10XCHG(交换名字);比较SI和ENDADDR;小于或等于时,转移到G30;比较SWAPPED和0;若不等于转移到G20;子程序返回;退出;子程序H10XCHG(交换两个名字);10(即A传给CX);重复执行串操作直到CX=0;重复执行10次串操作MOVSW;将NAMESAV的有效地址传送给SI;重复执行10次串操作MOVSW;1传给SWPPEDRETH10XCHG ENDP;-----------------K10DISP PROC NEAR 字)MOV AH,09;子程序返回;退出;子程序K10DISP(显示排序后的名LEA DX,MESSG2INT 21HLEA SI,NAMETAB LEA DI,NAMESAV MOV CX,10 REP MOVSW MOV AH,9;将MESSG2的有效地址传送给DX;显示MESSG2:即字符串:'Sorted name:';将NAMETAB的有效地址传送给SI;将NAMESAV的有效地址传送给DI;重复执行10次串操作MOVSW K20 :LEA DX,NAMESAV;将NAMESAV的有效地址传送给DXINT 21H;显示NAMESAV名字数据DEC NAMECTR;计数器--JNZ K20;NAMECTR不等于0,仍转至K20RET;子程序返回 K10DISP ENDP;退出;-----------------;************************************************ END BEGIN ;程序结束第二篇:微机原理课程设计合肥工业大学计算机与信息学院课程设计课程:微机原理与接口技术设计专业班级:计算机科学与技术班学号:2姓名:一、设计题目及要求:利用 8259A中断,实现对8253多种计数初值的设定: 1.在中断服务程序中设定8253的计数初值。

川大微机上机实验报告(冒泡排序法)

川大微机上机实验报告(冒泡排序法)

川⼤微机上机实验报告(冒泡排序法)上机⽬的:1、了解并逐步熟悉汇编语⾔的编辑⽅法及特点.2、复习8088汇编语⾔的段结构、常⽤的指令与伪指令、存储空间的分配等。

3、掌握汇编语⾔的编辑、汇编及连接的过程。

4、了解并逐步掌握运⽤DEBUG进⾏调试汇编语⾔程序。

5、掌握循环结构程序的设计编程。

上机内容:⽤冒泡法对⼀组数300,250,280,240,260按从⼩到⼤的顺序排列。

提⽰:1、⽤冒泡的⽅法对⼀组数据元素排序,它的基本⽅法是:将相邻的两个元素通过⽐较进⾏排序,通过多次,多遍的邻元素排序,实现整个⼀组数的排序。

2、对于5(N)个元素,整个排序通过4遍(=N-1)邻元素排序完成。

每⼀遍的排序由若⼲次邻元素的排序组成。

3、4遍排序中,邻元素的排序依次为4,3,2,1遍。

完成第⼀遍排序后,最⼤数沉底,已经到达它应占据的位置,不需要参加下⼀遍的排序。

外循环的次数为CX=4次(N-1),内循环的次数为4,3,2,1(DEC CX)思考如何输⼊任意五个数,五个数可以有⼀位数,⼆位数,三位数,四位数,五位数,混合输⼊⽐较⼤⼩;2、对这组数⽤冒泡法进⾏排序,并输出原始数据及排序后数据,两两数据之间⽤空格分隔;3、利⽤DEBUG调试⼯具,⽤D0命令,查看排序前后,内存数据的变化,以及会⽤调试命令查看程序运算中寄存器中的值;4、去掉最⼤和最⼩的两个值,求出其余值的平均值,并输出最⼤值,最⼩值和平均值;5、⽤压栈PUSH和出栈POP指令“先进后出”的特点,设计算法将平7、设计程序要有模块化的思想,⽤⼦程序实现不同的功能;8、所有数据输出前要⽤字符串的输出指令,进⾏输出提⽰(如:zui dazhi shi : 300等),所有数据结果能清晰地显⽰在电脑屏幕上。

程序流程图如下:程序清单:DATAS SEGMENTSHU2 DB 4,?,3 DUP(?)SHU3 DB 4,?,3 DUP(?)SHU4 DB 4,?,3 DUP(?)SHU5 DB 4,?,3 DUP(?)AVER DB 3 DUP(?)SHUCHU DB 'PAI XU HOU DE SHU JU SHUN XU SHI',':','$'MAX DB 'ZUI DA ZHI SHI',':','$'MIN DB 'ZUI XIAO ZHI SHI',':','$'AVERAGE DB 'PING JUN ZHI SHI',':','$'CHUSHU DB 100,10HE DW ?STR1 DB 16 DUP(30H)STR2 DB 'PING JUN ZHI DE ER JIN ZHI CHUAN SHU CHU',':','$' DATAS ENDS CODES SEGMENTASSUME CS:CODES,DS:DATASSTART: MOV AX,DATASMOV DS,AXMOV ES,AXLEA DX,SHURU;显⽰QING SHU RU 5 GE SHU JU:MOV AH,9INT 21HMOV CX,5;输⼊五个数字MOV SI,0INPUT: LEA DX,[SHU1+SI];输⼊要排序的原始数据MOV AH,10INT 21HMOV DL,10;输⼊后换⾏MOV AH,2INT 21HADD SI,5;指针加5,指向下⼀个变量LOOP INPUTCLDMOV CX,4;设定排序外循环次数L1: MOV BP,0PX: PUSH CXMOV CX,3LEA SI,[SHU1+BP+2];逐位⽐较两个数⼤⼩LEA DI,[SHU1+BP+7]REPZ CMPSBJB L2;如果⼩于直接⽐较下⼀个数,否则两个数对换位置MOV CX,3Jh: MOV AL,SHU1[BP+2]XCHG AL,SHU1[BP+7];将两个字节对换位置,循环3次即完成这两个数的交换XCHG AL,SHU1[BP+2]INC BPLOOP JhSUB BP,3L2: ADD BP,5;指向后⾯两个数字POP CXLOOP PXPOP CX;外循环次数出栈LOOP L1LEA DX,SHUCHU;输出字符串'PAI XU HOU DE SHU JU SHUN XU SHI:' MOV AH,9 INT 21HMOV CX,5MOV SI,2OUTPUT:PUSH CX;计数器⼊栈实现循环嵌套MOV CX,3L3: MOV AL,[SHU1+SI];输出排序后的5个数字MOV DL,ALMOV AH,2INT 21HINC SILOOP L3MOV DL,2CHMOV AH,2INT 21HPOP CX;计数器出栈LOOP OUTPUTMOV DL,10MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,MAX;输出字符串'ZUI DA ZHI SHI:' MOV AH,9INT 21HMOV SI,2L4: MOV DL,[SHU5+SI];输出最⼤值MOV AH,2INT 21HINC SILOOP L4MOV DL,10;换⾏MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,MIN;输出字符串'ZUI XIAO ZHI SHI:' MOV AH,9INT 21HMOV CX,3MOV SI,2L5: MOV DL,[SHU1+SI];输出最⼩值MOV AH,2INT 21HINC SILOOP L5MOV DL,10INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,AVERAGE;输出字符串'PING JUN ZHI SHI:'MOV AH,9INT 21HMOV CX,3MOV BX,10;除数10MOV SI,2AD: MOV DX,0MOV AH,0PUSH CXMOV CX,3ZH: MOV AL,[SHU2+SI];将⼗进制数转换为⼆进制数,为后⾯求平均值做准备 SUB AL,30H PUSH AXMOV AX,DXMUL BXPOP AXADD DX,AXINC SILOOP ZH;执⾏3次完成3个⼗进制数的转换ADD SI,2POP CXADD HE,DX;将DX的数放在HE中LOOP AD;循环后得到三个⼗进制数转换为⼆进制数之后的相加和MOV DX,HE;MOV AX,DXXOR DX,DXMOV BX,3DIV BX;除3取平均值,结果将商放在AX中,余数放在DX中MOV BX,AX;给BX赋值平均数,然后将BX中表⽰的⼗进制数转换为对应的字符串DIV CHUSHU;除100取最⾼位ADD AL,30H;转换为ASCII码DIV [CHUSHU+1];除10取⼗位ADD AL,30HADD AH,30H;余数就是个位MOV [AVER+1],ALMOV [AVER+2],AHMOV CX,3MOV SI,0L6: MOV DL,[AVER+SI];输出平均值MOV AH,2INT 21HINC SILOOP L6MOV DL,10MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,STR2 ;输出字符串'PING JUN ZHI DE ER JIN ZHI CHUAN SHU CHU:’ MOV AH,9 INT 21HMOV CX,16MOV SI,0L7: RCL BX,1;将平均数转换为⼆进制串JNC L8ADD [STR1+SI],1;如果不为0就将其加1变成1的ASCII码值L8: MOV DL,[STR1+SI];将⼆进制串逐个输出MOV AH,2INT 21HINC SILOOP L7MOV AH,4CHINT 21H⼼得体会:本次实验编程⽐较复杂,在编这个程序之前⾃⼰先将前⾯三个练习编了⼀下,然后参考了书上的⼀个冒泡排序法的程序,之后才开始动⼿编该程序。

8086汇编语言指令表(按字母顺序)

8086汇编语言指令表(按字母顺序)
(2) 若(AL) and 0F0H>90H 或 CF=1,则(AL)<--(AL)+60H,CF<--1.
2. 示例: (AL)=18H,(BL)=06H
ADD AL,BL ; (AL)<--(AL)+(BL) ; (AL)=1EH
DAA ; (AL)
DAS
组合十进制减法调整指令 DAS(Decimal Adjust for Subtraction)
则(AL)<--(AL)-6,(AH)<--(AH)-1,CF<--AF,(AL)<--(AL) and 0FH,
否则(AL)<--(AL) and 0FH
ADC
带进位加法指令 ADC(Addition Carry)
格式: ADC OPRD1,OPRD2
功能: OPRD1<--OPRD1 + OPRD2 + CF
DAA
组合的十进制加法调整指令 DAA(Decimal Adjust for Addition)
格式: DAA
功能: 对AL中的两个组合进制数相加的结果进行调整,调整结果仍放在AL中,进位标志放在CF中.
说明:
1. 调整操作如下
(1) 若(AL) and 0FH>9 或 AF=1,则(AL)<--(AL)+6,AF<--1,对低四位的调整.
格式: DAS
功能: 对两个组合十进制数相减后存于AL中的结果进行调整,调整后产生一个组合的十进制数且仍存于AL中.
说明:
调整操作
若(AL) and 0FH > 9 或 AF=1,则(AL)<--(AL)-6,AF=1
若(AL) and 0F0H > 90H 或 CF=1,则(AL)<--(AL)-60,CF=1
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机硬件实验室实验报告课程名称:微机原理及应用
四.实验结果分析()含执行结果验证、输出显示信息、图形、调试过程中所遇的问题及处理方法等初始化数据:2 3 1 4 5
1、直接选择排序
第一次:5 3 1 4 2
第二次:5 4 1 3 2
第三次:5 4 3 1 2
第四次:5 4 3 2 1
即完成直接选择排序。

.2、冒泡排序
第一次:3 2 4 5 1
第二次:3 4 5 2 1
4 5 3 2 1
第三次:
第四次:5 4 3 2 1
即完成冒泡排序。

五.结论
本次实验完成了用选择排序法和冒泡排序法的五个数的排序,在排序完成时跳出程序。

灵活应用了比较、循环和跳转,将实验跟理论相结合,加深了对知识的理解。

报告提交日期。

相关文档
最新文档