微机原理上机作业汇编语言输入若干数字,其中有大于十的,从小到大排序

合集下载

汇编语言实现十个数的排序

汇编语言实现十个数的排序

DATAS SEGMENTDATA0 DB'Please input a numbers (0-65535):','$' DATA1 DB' over flow input again:','$' DATA2 DB'The num you have put is:',0ah,0dh,'$' DATA3 DB'After exchange the num is:',0ah,0dh,'$' DATA4 DB' ','$'DATA DW 10 DUP(?)DATAS ENDSSTACKS SEGMENTDW 256 DUP(?);此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS ;/****************************************/ ;-----------程序开始------------START:MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,10;----------循环输入------------L:CALL INPUTADD SI,2CALL NEWLINELOOP LMOV DX,OFFSET DATA2MOV AH,9INT 21H;-------输入后显示----------MOV CX,10MOV DI,0AGAIN:CALL PRINTCALL SPACEADD DI,2LOOP AGAIN;----------排序-------------MOV CX,9MOV DI,0LOOP0:CALL SORTADD DI,2LOOP LOOP0CALL NEWLINEMOV DX,OFFSET DATA3MOV AH,9INT 21H;----------交换后显示-------------MOV CX,10MOV DI,0AGAIN0:CALL PRINTCALL SPACEADD DI,2LOOP AGAIN0;----------返回系统--------------EXIT:MOV AH,4CHINT 21H;/**************************************/ ;------------输入函数--------INPUT PROC NEARPUSH AXPUSH BXPUSH CXPUSH DX;----------提示信息----------MOV DX,OFFSET DATA0MOV AH,9INT 21HMOV BX,0 ;BX存放十进制数CLCMOV DX,0L0:;----------输入数字----------MOV AH,1INT 21HCMP AL,0DHJE L1SUB AL,30HJL NEXT1CMP AL,9JG NEXT1;---------转换成十进制数-------MOV AH,0XCHG AX,BXMOV CX,10MUL CXADD AX,BXJC NEXT1XCHG AX,BXJMP L0NEXT1:MOV DX,0MOV BX,0CALL NEWLINECALL ERRORJMP L0L1:CMP DX,0JNZ NEXT1MOV DATA[SI],BXMOV DX,0POP DXPOP CXPOP BXPOP AXRETINPUT ENDP;/*****************************/ ;-------回车换行--------NEWLINE PROC NEARPUSH AXPUSH DXMOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HPOP DXPOP AXRETNEWLINE ENDP;/*********************************/;--------空格-------SPACE PROC NEARPUSH AXPUSH DXMOV DX,OFFSET DATA4MOV AH,9INT 21HPOP DXPOP AXRETSPACE ENDP;/**************************************/ ;----------错误提示----------------ERROR PROC NEARPUSH AXPUSH DXMOV DX,OFFSET DATA1MOV AH,9INT 21HPOP DXPOP AXRETERROR ENDP;/************************************/ ;--------冒泡排序子程序-----------SORT PROC NEARPUSH BXPUSH DXLOOP1:ADD SI,2MOV BX,DATA[DI]CMP BX,DATA[SI]JA CHANGEJMP NEXTCHANGE:MOV DX,DATA[SI]MOV DATA[DI],DXMOV DATA[SI],BXNEXT:CMP SI,18JL LOOP1POP DXPOP BXRETSORT ENDP;/***********************************/ ;-----------显示函数--------PRINT PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXMOV CX,0MOV BX,10MOV AX,DATA[DI]LAST:MOV DX,0DIV BXPUSH DXINC CXCMP AX,0JNZ LASTAGE:POP DXOR DX,30HMOV AH,2INT 21HLOOP AGEPOP DXPOP CXPOP BXPOP AXRETPRINT ENDP CODES ENDSEND START。

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

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

一、实验目的(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:六、心得体会在本次汇编语言程序设计实验中,我们学习了汇编语言的循环结构,并对冒泡排序法进行了汇编程序设计,我首先编写了对给定数据进行冒泡排序的算法设计,这有助于我熟悉冒泡排序的逻辑结构,理清设计思路。

基于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。

西安电子科技大学微机原理上机要求及必做题目答案(汇编实现)

西安电子科技大学微机原理上机要求及必做题目答案(汇编实现)

西安电子科技大学微机原理上机要求及必做题目答案(汇编实现)必做题目:1、编写求十进制数12678532与21736543之和的程序,并将和以十进制数的形式送屏幕显示。

2、有一个首地址为A的N字数组,请编程序使该数组中的数按从大到小的次序排列。

1、编写求十进制数12678532与21736543之和的程序,并将和以十进制数的形式送屏幕显示。

编程要求与提示:[1]两个加数均以压缩(组合)十进制数形式存放在ADD1和ADD2为首址的存贮器单元。

[2]和以压缩十进制数的形式存入SUM以下单元。

[3]将和送到屏幕显示部分功能的实现采用子程序的形式。

汇编语言实现如下:STACKSTACKDATAADD1ADD2SUMDATACODESTART:MOVA某,DATAMOVDS,A某MOVA某,DATAMOVES,A某MOVA某,STACKMOVSS,A某LEASI,ADD1[3]LEAB某,ADD2[3]LEADI,SUM[3]MOVC 某,4CLCL1:MOVAL,[SI]ADCAL,[B某]DAAMOV[DI],ALDECSIDECB某DECDILOOPL1SEGMENTSTACKDB10HDUP(00)ENDSSEGMENTDB12H,67H,85H,32HDB21H,73H,65H,43HDB4HDUP()ENDSSEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK必做题目:1、编写求十进制数12678532与21736543之和的程序,并将和以十进制数的形式送屏幕显示。

2、有一个首地址为A的N字数组,请编程序使该数组中的数按从大到小的次序排列。

CALLDISPAL;-------------------------------------E某ITPROC:MOVAH,4CH;结束程序MOVAH,1INT21H;-------------------------------------DISPALPROCNEARPUSHA某PUSHB某PUSHC某PUSHD某PUSHDILEADI,SUMMOVC某,4 DISPAL2:MOVAL,[DI]SHRAL,1SHRAL,1SHRAL,1SHRAL,1MOVAH,2MOVDL,ALADDDL,3 0HINT21HMOVAL,[DI]ANDAL,0FHMOVAH,2MOVDL,ALADDDL,30HINT21HINCDILOOPDISPAL2POPDIPOPD某POPC某POPB某POPA某RETDISPALENDPCODEENDSENDSTART2、有一个首地址为A的N字数组,请编程序使该数组中的数按从大到小的次序排列。

微机原理上机 汇编语言程序

微机原理上机  汇编语言程序

上机作业四一.实验目的1.增强和提高汇编语言程序设计的能力,掌握模块化程序设计的方法.2.熟练掌握常用功能的调用方法.二.试验仪器586微机一台三.实验内容编写如下程序,并在机器上调试成功。

程序采用菜单式选择,可以接收用户从键盘输入的五个命令(1-5),各命令功能分别为:(1)按下“1”键,完成字符串小写字母变成大写字母。

用户输入一由英文大小写字母或数字0-9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其他字符不变,并在屏幕上显示。

用户按任一键,重做,按键,返回主菜单。

(2)按下“2”键,完成找最大值(二选一)。

a.接收用户输入的可显示字符串(以回车结束),程序将其中码值最大的字符显示出来;b.接收用户输入若干个无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。

用户按任一键,重做,按键,返回主菜单。

(3)按下“3”键,完成排序(二选一)。

a.接收用户输入的可显示字符串,以回车结束。

程序按码值大小由大到小排序并输出显示;b.接收用户输入若干个有符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。

用户按任一键,重做,按键,返回主菜单。

(4)按下“4”键,显示时间。

首先提示用户对时,即用户输入时、分、秒(以空格或逗号为分隔符,以回车结束),然后,在屏幕上不断显示时间,格式为:(时): (分): (秒)最好定点显示。

用户按任一键,重新对时,按键,返回主菜单。

(5)按下“5”键,结束程序运行,返回系统提示符。

四.程序代码256 (?)G1, G2, G3, G4, G51 '1. ;', 0, 0, '$'2 '2. ;', 0, 0, '$'3 '3. ;', 0, 0, '$'4 '4. ;', 0, 0, '$'5 '5. .', 0, 0, '$'' (1-5) : $'' ( & , 60 ) :', 0, 0, '$'' : $'' : $'' $'' $'' (0 - 255, 20 ) : ', 0, 0, '$'' : ', 0, 0, '$'' () : $'' , ; !$'61?61 (?)?20 (?), ,:,,,,,: ; 设置显示器:, 2, 0 ; 页号, 41 ; 列号, 10 ; 行号10H ; 光标位置设置, 121HAL, '1'AL, '5'AL, '1' ; 1, 1 ; (1)*2; >,,[]G1:, 821HAL, 1MAING1G2:, 821HAL, 1MAING2G3:, 821HAL, 1MAING3G4:, 821HAL, 1MAING4G5:, 421H; 显示主界面;设置显示器方式, 0AL, 3;, 0;10H ; 清屏, 2, 0 ; 页号, 5 ; 列号, 5 ; 行号10H ; 光标位置设置, 921H, 2, 5 ; 列号, 6 ; 行号10H ; 光标位置设置, 9, 221H, 2, 5 ; 列号, 7 ; 行号10H ; 光标位置设置, 9, 321H, 2, 5 ; 列号, 8 ; 行号10H ; 光标位置设置, 9, 421H, 2, 5 ; 列号, 9 ; 行号10H ; 光标位置设置, 9, 521H, 2, 5 ; 列号, 10 ; 行号10H ; 光标位置设置, 9,21H; 将输入字符串中小写字母便换成大写字母:;设置显示器方式, 0AL, 310H ; 清屏, 2, 0 ; 页号, 5 ; 列号, 5 ; 行号10H ; 输入提示光标位置设置, 9,21H ; 输入字符串提示, 2, 5 ; 列号, 6 ; 行号10H ; 输入字符串光标位置设置, 0,21H ; 输入字符串+ 1, 0; 判断输入字符串是否为空串, + 2, + 1,,[], '$' ; 在输入字符串尾加结束标志$, 2, 0 ; 页号, 5 ; 列号, 7 ; 行号10H ; 源字符串提示光标位置设置, 9,21H ; 输出源字符串提示, 9, + 221H ; 输出源字符串, + 2:[], 61H[], 0:; 将字符串中小写字母转换成大写字母, 0 ; 页号, 5 ; 列号, 8 ; 行号10H ; 新字符串提示光标位置设置, 9,21H ; 输出新字符串提示, 9, + 221H ; 输出新字符串, 2, 0 ; 页号, 5 ; 列号, 9 ; 行号10H ; 提示信息光标位置设置, 9,21H ; 输出提示信息; 在输入字符串中找出最大值:;设置显示器方式, 0AL, 3, 010H ; 清屏, 2, 0 ; 页号, 5 ; 列号, 5 ; 行号10H ; 输入提示光标位置设置, 9,21H ; 输入字符串提示, 2, 5 ; 列号, 6 ; 行号10H ; 输入字符串光标位置设置, 0,21H ; 输入字符串+ 1, 0; 判断输入字符串是否为空串, + 2, + 1,,[], '$' ; 在输入字符串位加结束标志$, 2, 0 ; 页号, 5 ; 列号, 7 ; 行号10H ; 源字符串提示光标位置设置, 9,21H ; 输出字符串提示, 9, + 221H ; 输出字符串, 2, 0 ; 页号, 5 ; 列号, 8 ; 行号10H ; 新字符串提示光标位置设置, 9,21H ; 输出字符串中最大值提示, 0, + 2:[],, []:; 找出字符串中最大字符,放入, 221H ; 输出字符串中最大字符, 2, 0 ; 页号, 5 ; 列号, 9 ; 行号10H ; 提示信息光标位置设置, 9,21H ; 输出提示信息; 对输入数据组排序:;设置显示器方式, 0AL, 3, 010H ; 清屏, 2, 0 ; 页号, 5 ; 列号, 5 ; 行号10H ; 输入提示光标位置设置, 9,21H, 2, 5 ; 列号, 6 ; 行号10H ; 输入数据组光标位置设置, 0,21H ; 输入数据组字符串; 字符串转换成数据串AL, 0; 判断数据串是否有错, 0; 判断数据串是否为空, 2, 0 ; 页号, 5 ; 列号, 7 ; 行号10H ; 输出提示光标位置设置, 9,21H ; 输出数据串提示, 2, 0 ; 页号, 5 ; 列号, 8 ; 行号10H ; 输出数据组光标位置设置; 数据组排序; 数据组的输出, 2, 0 ; 页号, 5 ; 列号, 9 ; 行号10H ; 提示信息光标位置设置, 9,21H ; 输出提示信息; 读入整型数; 入口参数:无; 出口参数为:(有无错误标志,0为有,1为无), + 1, + 2, 0 ; 数据组数据个数置0, 10, 0 ; 当前数据0, 0 ; 有无数据标志置0,即无数据:[], ' '; 判断当前字符是否为空格[], '0'[], '9'; 判断当前字符是否在'0'-'9'之间, 1 ; 有无数据标志置1,即有数据,, [],, '0' ; 计算出当前数据x, 0; 判断x是否越界:, 1; 判断是否有数据; 数据组数据个数加1, 0, 0 ; 清零:, 0; 依次检查各字符, 1; 判断是否有未加入的数据:, ; 置数据组数据个数, 1 ; 输入数据无错误:, 0 ; 输入数据有错误:; 增加新数; 入口参数:(数据组数据个数)、(当前数据x); 出口参数:无,,,[],; 数据组排序,, 1; 若只有一个元素,停止排序,, ; 指向数据组首地址, ; 指向数据组末地址; 外循环次数1: ; 外循环开始, 0 ; 交换标志置02: ; 内循环开始, [], [ - 1], [ - 1] ; 交换操作[],, 1 ; 交换标志置1:LOOP 2, 1; 判断交换标志LOOP 1; 输出数据组,,, 10H, + 1:, [], 2, ' '21HLOOP; 将十进制数以十六进制输出; 入口参数:(待转换的数据),(转换进制数16); 出口参数:无, 0, 10, 7,AL, 0:, 221H; 设定并显示时间;设置显示器方式, 0AL, 3;, 0;10H ; 清屏, 2, 0 ; 页号, 5 ; 列号, 6 ; 行号10H ; 设置提示光标位置设置, 9,21H ; 时间串提示, 0,21H ; 输入时间串, 10, + 2AL, '0', + 3AL, '0'AL, 0AL, 24; 判断时有效性, AL, + 5, + 6AL, '0'AL, 0AL, 60; 判断分有效性,, + 8AL, '0', + 9AL, '0'AL, 0AL, 60; 判断秒有效性,, 0, 221H ; 置系统时间:; 显示时间子程序;设置显示器方式, 0AL, 3;, 0;10H ; 清屏, 2, 0 ; 页号, 10 ; 列号, 9 ; 行号10H ; 提示信息光标位置设置, 9,21H ; 输出提示信息1:, 2, 0 ; 页号, 72 ; 列号, 0 ; 行号10H ; 提示光标位置设置, 2 ; 取系统时间分别存放时/分/秒21H, ; 显示时, 2, ':'21H, ; 显示分, 2, ':'21H, ; 显示: 秒,02H ; 设置光标位置,090,010H,0018H: ,0 ; 延时: LOOP, 0 ; 或, 01H21H ; 16H, 0 ; 11 ; 检查键盘状态; 把中的数字以十进制输出; 入口参数:(待显示的数据); 出口参数:无, 10, '0',, '0', 2, AL21H,21H五.实验体会实验中遇到的问题以及解决方法:在这几次的编程实验中,我遇到了许多问题。

汇编语言源程序,实现10个有符号字型整数键盘输入,然后按反序输出所输入的10个有符

汇编语言源程序,实现10个有符号字型整数键盘输入,然后按反序输出所输入的10个有符

汇编语言源程序,实现10个有符号字型整数键盘输入,然后按反序输出所输入的10个有符号字型整数。

引言:汇编语言是一种低级机器语言,用于编写计算机程序。

它直接操作计算机硬件,具有高效性和灵活性。

本文将介绍如何使用汇编语言编写一个程序,实现键盘输入10个有符号整数,并按反序输出这些整数。

正文:1. 输入模块1.1 初始化键盘输入在汇编语言中,我们可以使用BIOS中断来初始化键盘输入。

通过调用INT 16h中断,我们可以设置键盘输入的模式和功能。

在本例中,我们将设置键盘输入模式为扫描码模式,并启用键盘中断。

1.2 读取键盘输入使用INT 16h中断的另一个功能来读取键盘输入。

通过调用INT 16h中断的功能号为0h的子功能,我们可以从键盘缓冲区中读取一个字符。

我们可以使用循环来读取10个字符,并将它们存储在内存中的一个数组中。

1.3 转换字符为整数由于键盘输入的字符是ASCII码,我们需要将它们转换为整数。

在汇编语言中,可以使用SUB指令将字符的ASCII码值减去字符'0'的ASCII码值,从而得到整数值。

2. 反序输出模块2.1 初始化输出与键盘输入类似,我们可以使用BIOS中断来初始化屏幕输出。

通过调用INT 10h中断,我们可以设置屏幕输出的模式和功能。

在本例中,我们将设置屏幕输出模式为文本模式,并清空屏幕。

2.2 输出整数我们可以使用INT 10h中断的功能号为0Eh的子功能来在屏幕上输出字符。

通过循环,我们可以从存储整数的数组中读取整数,并将其转换为字符后输出。

2.3 反序输出为了按反序输出整数,我们可以使用两个指针,一个指向数组的开头,另一个指向数组的末尾。

通过交换两个指针所指向的元素,我们可以实现反序输出。

总结:通过使用汇编语言编写的程序,我们可以实现键盘输入10个有符号整数,并按反序输出这些整数。

通过初始化键盘输入和屏幕输出,以及使用循环和指针操作,我们可以实现这个功能。

排序

排序

实验一、用8086/8088汇编语言进行数据排序一、实验目的:1、熟悉EMU8086集成开发环境的使用。

2、通过编程、上机调试,进一步理解汇编语言的设计思路与执行过程。

3、熟悉INT 21H中断调用。

4、掌握数据排序的常用算法,利用汇编语言实现数据排序。

5、巩固理论知识,锻炼动手编程。

二、实验内容:1、在TABLE1开始的内存单元中,预先存储100个有符号字类型的数值。

2、编写代码、将TABLE1中的100个数值,按照从大到小的排序,放在TABLE2开始的内存单元中。

3、将TABLE2中的数字,顺序输出在屏幕上。

4、查看TABLE1开始的内存的100个数值。

5、查看TABLE2开始的内存的100个数值。

三、设计思路:1、自定义一个display函数,用来往屏幕上显示特定的字符。

2、定义一个data段,用来存储固定的字符。

3、定义一个code段,当做主程序。

4、所用的方法是冒泡排序法5、主程序中第一步先获取键盘输入。

6、主程序中第二步将键盘输入的数存储到内存中。

7、主程序中第三步用[基址+变址]方法进行冒泡排序。

8、主程序中第四步将排序好后新的数组从内存中取出,并回显到屏幕上。

四、排序算法:1、冒泡排序:(1)比较相邻的两个元素,如果第二个比第一个大,则交换这两个值。

(2)对每一对相邻元素做相同的工作,从开始第一对到结尾的最后一对,这样最后的元素应该会是最大的数。

(3)针对所有的元素重复以上的步骤,除去最后一个。

(实际过程中是最后一个值和后面的一个空值进行比较)(4)重复(1)~(3),直至排序完成。

2、选择排序:(1)首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

(2)再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

(3)重复(1)~(2)过程,直至排序完成。

3、插入排序:(1)构建有序数列。

(2)对于未排序的数据,在已排序的数列中从后向前扫描。

(3)找到相对应的位置后插入。

第三次汇编上机作业

第三次汇编上机作业

微机原理上机实验报告(三)
班级:学号:姓名:
实验目的
(1)掌握比较指令、转移指令在分支程序设计中的使用方法。

(2)掌握分支结构程序的组成。

(3)掌握分支程序的设计、调试方法。

(4)熟悉DOS软中断及系统功能调用。

实验内容
从键盘上输入0-10之间的三个数字,比较其大小,完成三个数从大到小排序。

数的输入写了一个过程,把输入的三个数分别存入缓冲区。

输出显示也写了一个过程,先显示提示,然后按照从大到小的顺序输入显示缓冲区的三个数字。

提示:1.请用字母按键上方的键盘输入数字(不要使用键盘右侧的小键盘键入),以防程序运行错误。

2.输入的三个数字,分别放入AL、BL和CL中。

实验要求
请画出该分支程序排序过程的流程图,并且完善空白部分的源程序并补充分号后面的注释内容。

实验数据及结果
1.该分支程序排序过程的流程图
2.完整的程序源代码以及补充分号后面的注释内容:
3.程序输入数值以及运行程序后显示的结果:
实验过程中所遇到的问题及解决办法。

用汇编语言编写的排序程序

用汇编语言编写的排序程序

用汇编语言编写的排序程序一实验目的 (3)二题目 (3)三算法分析 (3)四流程图及算法 (5)五源程序附录a、参考文献一实验目的:1、进一步熟悉汇编语言的代码;2、学会分析算法并构造流程图;3、能够完成简单的子程序设计;4、学会查找程序的算法。

二题目将以地址DATA开始的10个无符号字数据按从大到小的顺序重新排列三算法分析排序算法采用冒泡法,假定待排序数组中有X1,X2,X3,…X10共十个无符号数据,冒泡排序法的具体做法是:最多有九次外循环。

每次外循环均从底部开始进行两两比较,若后者大于前者,两者位置交换,反之不变。

然后两两比较向前推移,直到本次外循环应完成的两两比较次数(成为内循环次数达到为止)。

此时,本次外循环结束,最大的数冒到本次外循环的顶部。

第一次外循环,第一次外循环,两两比较的次数为n-1次,最大数据冒到X1的位置;第二次外循环,两两比较次数为n-2次,剩余最大数据冒到X2位置;以此类推,第n-1次外循环,两两比较次数为1次,剩余最大数据项冒到X n-1的位置。

若再一次外循环结束后,经判断本次外循环一次位置交换也未发生过或仅在底部发生过一次交换,则本次外循环结束,数的顺序已排妥,余下的外循环不用进行了。

流程图如上所示。

根据流程图编写程序:如下:;程序模板SSEG SEGMENT PARA STACK 'stack'dw 100h dup(0) ;初始化堆栈大小为100SSEG ENDSDSEG SEGMENTDATA DW 150,12,54,89,73,152,45,68,98,65COUNT EQU $-DATABUFO DB 6 DUP (?),'$'DSEG ENDSESEG SEGMENT;附加段:在此处添加程序所需的数据ESEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEG, es:ESEG, ss:SSEGDISP PROC ;显示DI所指ASCII字符串的子程序PUSH DXPUSH AXMOV DX,DIMOV AH,09HINT 21HMOV DL,','MOV AH,2INT 21HPOP AXPOP DXRETDISP ENDPDATCH PROC FAR ;转换数值成为ASCII串的子程序PUSH DX ;入口参数在AX中,要转换的数在DI中 PUSH CX ;出口参数在DI中,是结果缓冲区指针 PUSH BXMOV CX,10MOV BX,AXDLOP1:DEC DIXOR DX,DXDIV CXOR DL,30HMOV [DI], DLCMP AX,0JNZ DLOP1POP BXPOP CXPOP DXRETDATCH ENDPMAIN PROC FAR ;主程序入口mov ax, dsegmov ds, axmov ax,esegmov es, axSTART:XOR AX,AXMOV DX,AX ;主程序MOV CX,AXMOV DX,COUNT/2 ;DX,被排序数据个数LOP1: DEC DX ;DX,大循环变量(大循环次数)MOV CX,DX ;CX,小循环变量(两两比较次数) MOV BX,DX ;设置交换标志LEA SI,BUFOSUB SI,2LOP2: MOV AX,[SI]CMP AX,[SI-2]JBE PASSXCHG [SI-2],AXMOV [SI],AXMOV BX,CXPASS: SUB SI,2LOOP LOP2CMP BX,DXJE DLAST ;数的顺序已排妥,转DLASTJMP LOP1DLAST:MOV CX,COUNT/2 ;显示的数据个数LEA SI,DATA ;数据的缓存区首地址LOP3: MOV AX,[SI]MOV DI,OFFSET BUFOADD DI,LENGTH BUFOCALL DATCHCALL DISPADD SI,2LOOP LOP3mov ah,1int 21hmov ax, 4c00h ;程序结束,返回到操作系统系统int 21hMAIN ENDPCSEG ENDSEND MAIN结果:。

汇编上机作业参考答案(

汇编上机作业参考答案(

汇编上机作业参考答案(上机作业实验题目:1:熟悉在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程。

2:编写程序,完成下面公式计算(其中变量X和Y是32位无符号数,变量A、B和Z是16位无符号数)A<-(X-Y+24)/Z的商B<-(X-Y+24)/Z的余数3:有单字节无符号数X,Y,Z,若X+Y>30,则求X+Z,否则则求X-Z,运算结果放入SUM单元中。

X,Y,Z,SUM 均为字节变量名。

(设X,Y,Z的值分别是 32,45,20,求得结果并输出;再设X,Y,Z 的值分别是 10,15,20,求得结果并输出。

要求尽量用DEBUG调试程序,修改数据。

)4:编写程序实现将数据段BUFF开始字节单元中的10个数字0,1,2,3,4,5,6,7,8,9转换成相应的ASCII码送入以ASC开始的内存单元。

(通过DEBUG指令查看程序执行结果)5:已知存储区有一首地址为ARRAY的字数组,元素个数为10,现在要求将数组的每个数据都加2(不考虑数据溢出)。

6:在一个字节数组ARRAY中找到第一个非零数据,如果找到,则显示第一个非0数据的下标,否则输出“NO FOUND”。

7:题目要求:在数据段以YVAR为首地址的区域中,存放有字数据,用串操作指令把第三个数据传送到数据段以MVAR为首地址的单元中。

8:与REP前缀相配合工作的MOVS串传送指令题目要求:在数据段以YVAR为首地址的区域中,存放有6个字的数据,用串操作指令把后4个字的数据传送到数据段以MVAR为首地址的4个字的单元中。

上机作业参考答案1:熟悉在PC机上编辑、汇编、连接、调试和运行汇编语言程序的过程。

2:编写程序,完成下面公式计算(其中变量X和Y是32位无符号数,变量A、B和Z是16位无符号数)A<-(X-Y+24)/Z的商B<-(X-Y+24)/Z的余数DATA1 SEGMENTX DD ?Y DD ?Z DW ?A DW ?B DW ?…DATA1 ENDSCODE1 SEGMENT…MOV AX,XMOV DA,X+2SUB AX,YSBB DX,Y+2ADD AX,24DADC DX,0DIV ZMOV A,AXMOV B,DX…3:有单字节无符号数X,Y,Z,若X+Y>30,则求X+Z,否则则求X-Z,运算结果放入SUM单元中。

微机原理上机作业汇编语言输入若干数字,其中有大于十的,从小到大排序

微机原理上机作业汇编语言输入若干数字,其中有大于十的,从小到大排序

微机原理上机作业汇编语言输入若干数字,其中有大于十的,从小到大排序汇编语言程序排序对输入的多个数字进行排序。

要求:(a)所有数字从键盘输入;(b)数字中至少包含一个大于10的数字;(c)排好序的数字以十进制形式在屏幕显示输出。

data segmentshuzi_w db 0;shuzi_q db 0;shuzi_b db 0;shuzi_s db 0;shuzi_g db 0 ;将排序好的数字显示出来,需要每一位转换成ASCII 码key DW 100 dup(0) ;输入的数的存放位置buffer dw 0 ;输入数字的暂存位置输入的数字大于10 需要缓冲n db 1 ; 总共输入的数字个数注意从1开始loop循环原因n1 db 1; add your data here!pkey db 'the programmer has been done ..' ,0dh,0ah,24hstring db 'please input data: ',0dh,0ah,24hstring1 db 0dh,0dh,0dh,0dh,'output: ',0dh,0ah,'$'kongge db 0dh, 0ah,24hendsstack segmentdw 128 dup(0)endscode segmentstart:; set segment registers:xor ax,axpush axmov ax, datamov ds, axmov es, axlea dx , stringmov ah, 09hint 21h ;显示请输入数据mov di , offset keymov ax , 0mov buffer,axbiaohao1: ;程序输入处mov ah,08h ;键盘输入但不显示int 21h ; 输入保存在AL中cmp al,0dh; 输入是回车,直接结束输入jz biaohao4cmp al,'0' ;当输入的数在0到9中间时输入的是ASCII码jb biaohao2 ;不跳转否则跳转cmp al,'9'ja biaohao2;若输入的数在0到9之间时mov ah,2mov dl,al ;显示此数int 21hsub al,30hmov ah,0push ax ; 保存刚输入的数字mov bx,buffermov ax,10mul bx ;ax=10*bufferpop bx ; 将上面保存的ax 的值给bxadd ax,bx ;ax=10*buffer+bx(之前的ax) 输入的数字大于10 mov buffer,ax ;将ax 的值给bufmov [di],ax ;若输入11,循环第一次输入是1,第二次重输入12 jmp biaohao1; 输入大于10 的数字的下一位biaohao2: ;输入数字不是0到9cmp al,20h ;输入是否是空格je biaohao3 ;是的话跳出循环jmp biaohao1 ; 不是的话继续输入下一位biaohao3: ;是空格表示输入下一个数字call konggexianshi ;屏幕上显示空格add di,2 ;修改di指针,输入下一个数字inc n ;输入的数字个数加一mov ax,0mov buffer,ax ;初始化jmp biaohao1;继续输入下一个数字biaohao4:mov al,ncmp al,0jz qw ;没有输入数字就直接回车,结束程序call konggexianshi call paixu;数字显示部分push dxpush axlea dx,string1mov ah ,09hint 21hpop axpop dxmov cx,0mov cl, nmov bx,offset keydisp:mov dx,0; chushihuamov ax,[bx]call shujuxianshicall konggexianshiinc bxinc bxloop disp;================================== paixu proc nearmov al,nmov n1,al; 外循环、loop1:mov cl,nmov ch,0;内循环dec cxmov bx,offset keyloop2:mov ax,[bx]cmp ax,[bx+2]jna loop3 ;ax不大于bx+2,不交换push axmov ax,[bx+2]mov [bx],axpop axmov [bx+2],axloop3:add bx,2loop loop2dec n1jz paixuendjmp loop1paixuend:retpaixu endp;================================= konggexianshi proc nearpush axpush dxmov ah,09mov dx ,offset konggeint 21hpop dxpop axretkonggexianshi endp;===================================== xianshidangeshuzi proc nearpush dxpush axmov dx,0mov dl,alxor ax,axmov ah,02hint 21hpop axpop dxretxianshidangeshuzi endp;===================================== shujuxianshi proc nearpush cxpush dsmov cx,10000div cxpush dx ;保存余数mov shuzi_w,alcmp shuzi_w,0je j1add al,30hcall xianshidangeshuzij1:pop ax;取余数mov dx,0mov cx,1000div cxpush dx;保存余数mov shuzi_w,al;add shuzi_w,alcmp shuzi_w,0;cmp shuzi_q,0je j2add al,30hcall xianshidangeshuzij2:pop ax;取余数mov dx,0mov cx,100div cxpush dx;保存余数mov shuzi_w,al; add shuzi_w,alcmp shuzi_w,0;cmp shuzi_b,0je j3add al,30hcall xianshidangeshuzi j3:pop ax;取余数mov dx,0mov cx,10div cxpush dx;保存余数mov shuzi_w,al;add shuzi_w,alcmp shuzi_w,0;cmp shuzi_s,0je j4add al,30hcall xianshidangeshuzi j4:pop dxadd dl,30hmov al,dlcall xianshidangeshuzixor ax,ax ;chushuhuamov shuzi_w,al; mov shuzi_q,al; mov shuzi_b,al; mov shuzi_g,alpop dspop cxretshujuxianshi endpqw:call konggexianshi; add your code herelea dx, pkeymov ah, 9int 21h ; output string at ds:dx; wait for any key....mov ah, 1int 21hmov ax, 4c00h ; exit to operating system.int 21hendsend start ; set entry point and stop the assembler.。

微机原理-实验一-汇编语言-冒泡排序

微机原理-实验一-汇编语言-冒泡排序

微机原理实验报告班级:XXXXX姓名:XXXX学号:20XXXXXXXXX大学信息科学与技术学院信息工程系实验一汇编语言程序设计-(具体题目)一、实验目的(根据实际情况修改):1、熟悉MASM编译环境,了解程序的汇编方法;2、熟悉常用汇编指令,学习汇编程序设计方法;3、学习汇编语言的调试过程,通过调试过程认识CPU执行程序的方式;4、了解冒泡法原理,学习多重循环的编程方法。

二、实验内容:编写程序,用冒泡法实现将数据段内9,8,7,6,5,4,3,2,1按照由小到大的顺序重新排列。

三、程序流程图和程序代码1、流程图2、代码与注释(代码不能和指导书完全一样,写出注释,写出寄存器尤其是DS的值)data segmentbuf1 db 8,7,6,5,4,3,2,1data endscode segmentassume cs:code,ds:datastart: mov ax,data //传送数据段datamov ds,axmov dx,7 //dx放外循环7次L3: mov cx,dx //cx放内循环7次lea si,buf1 //将db里的数据传送到siL2: mov al,[si]cmp al,[si+1] //比较[si]与[si+1]jb L1 //[si]<[si+1],跳转到L1xchg al,[si+1] //[si]>[si+1],两两交换mov [si],alL1: inc si //si减1loop L2 //循环L2dec dx //外循环减1,没减到0则跳转到L3 jnz L3 //入内循环,计数初值mov ah,4chint 21hcode endsend start四、调试过程及遇到的问题1、程序执行截图2、调试用到的命令-U命令:查看数据段地址;-d命令:查看运行前后存储器内容;-g命令:运行程序;-t命令:查看运行前后寄存器和存储器内容。

3、遇到的问题及解决办法问题:运行程序后,数据1在存储器地址末尾没变。

微机原理实验报告——字符串排序

微机原理实验报告——字符串排序

一、实验名称:字符串排序二、实验目的:⑴学习利用系统功能调用的“INT 21H”进行字符的输入、字符串的显示方法,熟悉排序相关指令及方法。

⑵掌握汇编语言的编写、编译、连接及运行方法。

三、实验内容:①利用INT 21H的1号功能,从键盘输入任意长度的字符串,以回车符结束。

②将输入的字符串存放在数据段中。

③对输入的字符串按ASCⅡ码从小到大排序(ASCⅡ码小者占低地址存放)。

④将排好序的字符串利用INT 21H的9号功能显示在微机屏幕上。

四、程序流程图:定义堆栈段、数据段分配各段调用输入程序,输入并存储一个字符NO输入是否为回车键YES冒泡法对存储单元中的内容排序使用INT 21H的9号功能,将排好序的字符串输出返回DOS五、结论:程序运行时,从键盘上输入包含数字、大、小写字母的字符串,回车后,屏幕上显示字符ASCⅡ码从小到大排列的结果。

六、实验心得:通过实验,首先,我进一步理解学习了冒泡法排序的具体过程:冒泡法的外层循环次数等于其排序总数减一,每层内循环次数等于外循环总数减去已执行的次数。

第二,在编写程序时,如若程序太长,最好将一段反复使用的程序段编成子程序,在主程序中反复调用即可。

第三,在使用INT 21H的各种功能时,要注意将功能号值付给AH,并需正确使用入口、出口参数。

最后,堆栈段、数据段使用时要特别注意,堆栈段必须重新定义,程序中使用数据段时也要对数据段进行重新定义,否则程序将产生错误。

附:程序清单STACK SEGMENT STACKDB 100 DUP(?)STACK ENDSDA TA SEGMENTX DB 100 DUP(?)DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TA,SS:STACKMAIN PROCMOV AX,DATAMOV DS,AXMOV SI,OFFSET XCALL INPUTSUB SI,2MOV BX,SINEXT3:MOV CX,BXMOV SI,OFFSET XNEXT2:MOV AL,[SI]CMP AL,[SI+1]JBE NEXT1XCHG AL,[SI+1]MOV [SI],ALNEXT1:INC SILOOP NEXT2DEC BXJNZ NEXT3MOV DX,OFFSET XMOV AH,9INT 21HMOV AH,4CHINT 21HMAIN ENDPINPUT PROCSTART:MOV AH,1INT 21HMOV [SI],ALINC SICMP AL,0DHJNZ STARTMOV BYTE PTR [SI-1],'$'RETINPUT ENDPCODE ENDSEND MAIN。

微机原理与汇编语言实验03_循环程序设计实验

微机原理与汇编语言实验03_循环程序设计实验

微机原理与汇编语言实验实验三循环程序设计实验一实验目的1、掌握循环程序的设计方法。

2、掌握比较指令、转移指令和循环指令的使用方法。

3、进一步掌握调试工具的使用方法。

二实验预习要求1、复习比较指令、条件转移指令和循环指令。

2、复习循环程序的结构、循环控制方法等知识。

3、读懂“三实验内容”中给出的将十进制数转换为二进制数以及将二进制数转换为十进制数的程序。

4、根据“三实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。

5、从“四实验习题”中任选一道题目,编写源程序,以便上机调试。

三实验内容计算1+2+……n=?,其中n通过键盘输入。

要求在屏幕上提供如下信息:Please input a number(1 627): ;出现此信息后通过键盘输入一个小于628的无符号整数1+2+…..n=sum;其中n为用户输入的数,sum为所求的累加和程序运行情况如下图所示(说明:图中所运行程序允许累加和不大于一个32位二进制数所能表示的范围)。

1、编程指导(1)键盘输入的十进制数如368在计算机中是以33H,36H,38H形式存放的,如何将它们转换为一个二进制数101110000B,以便对累加循环的循环次数进行控制是本程序首先要解决的问题。

将键盘输入的十进制数转换为二进制数的程序清单如下:.model small.stack.dataINF1 DB "Please input a number (0-65535):$"IBUF DB 6,0,6 DUP(?).codeSTART: MOV AX, @dataMOV DS, AXMOV DX, OFFSET INF1MOV AH, 09HINT 21HMOV DX, OFFSET IBUF ;键入一个十进制数(<65535)MOV AH, 0AHINT 21HMOV CL, IBUF+1 ;十进制数的位数送CXMOV CH, 0MOV SI, OFFSET IBUF+2 ;指向输入的第一个字符(最高位)MOV AX, 0 ;开始将十进制数转换为二进制数AGAIN: M OV DX, 10 ;((0⨯10+a4) ⨯10+…) ⨯10+a0MUL DXAND BYTE PTR [SI], 0FHADD AL, [SI]A DC AH, 0I NC SILOOP AGAINMOV AH, 4CHINT 21HEND START本程序功能:从键盘接收一个无符号十进制整数(小于65535),将其转换为二进制数,转换结果存在AX寄存器中。

微机原理与接口技术实验56-

微机原理与接口技术实验56-
XOR AX,AX
L1:ADD AX,WORD PTR[SI]
INC SI
INC SI
LOOP L1
MOV WORD PTR[SI],AX
RET
SUM ENDP
CODE ENDS
END START
例4.65
MDATA SEGMENT
ARY1 DB 20 DUP(01)
SUM1 DW ?
ARY2 DB 100 DUP(08)
MOV AL,[BX]
MOV AL,00H
MOV [BX],AL ;对4100H地址处的内容清零
MOV DI,4000H ;缓冲区首地址4000H赋值给DI
MOV CX,0010H ;计数器CX赋值为BUFF数组中的个数
FIRST:
MOV AL,[DI]
CMP AL,00H ;比较数组的第一个元素,看是否为0
在4000H-400FH中查出有几个字节是零,把计数个数放在4100H中。
实验环境
Debug环境。
实验步骤
在4000H-400AH中通过键盘命令输入不等的10个数,运行本实验程序后检查4000H-400AH中内容是否按从大到小排列。在和PC机联机时,用连续单步方式,可很清楚地看出数据排序时数据移动变化情况。
xchg ax,bx;交换AX,BX中的数据
add bx,ax;AX,BX数据相加,存储在BX中
POP CX;CX出栈。CX=0002H
DEC CX;CX减一。由于在调整输入数据时用到CX,为保证数据不被更改,故用入栈出栈方式保存。此时CX=0001H。保证在每次输入时要输入两次数据。
CMP CX,0000H;将CX与0000H比较
JNZ newchar;不等于0,则表示一个完整的两位十进制数字没有输入完,继续跳转到newchar

汇编语言输入10个数排序并输出的实现

汇编语言输入10个数排序并输出的实现

汇编语⾔输⼊10个数排序并输出的实现⼀:题⽬描述在键盘输⼊任意10个数1. 按从⼩到⼤排序后,在计算机屏幕上先输出来。

要有结果提⽰(字符串显⽰)。

2. 将10个数做累加,结果在计算机屏幕显⽰累加和。

⼆:伪指令的定义1.数据段ATAS SEGMENTstring_1 DB 'Please input a numbers(0-65536):','$'string_2 DB 'ERROR: OVERFLOW! Please input again:','$'string_3 DB 'The array you have input is:',0ah,0dh,'$'string_4 DB 'After Sort the num is:',0ah,0dh,'$'string_5 DB ' ','$'DATA DW 10 DUP(?)massege DB 'The sum of the array is: ',0ah,0DH,'$'DATAS ENDS说明:string_1输⼊范围提⽰string_2输⼊错误提⽰string_3输出原数组提⽰string_4输出排序后数组提⽰string_5空格符DATA缓冲区数组2.堆栈段STACKS SEGMENTDW 256 dup(?)STACKS ENDS3.代码段CODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS三:模块分解与实现1. DOS输⼊10个数字输⼊10个⽆符号数存⼊缓冲区,并且保证 num&lt;65536num &lt; 65536num<65536为何输⼊范围是65536呢⼀个字的最⼤表⽰范围是 FFFFFFFFFFFF 其在⼗进制的表⽰下为 65535HEX FFFFDEC65535BIN1111 1111 1111 11111.1 输⼊函数⼦程序;---------输⼊函数(单数字输⼊)------------Input PROC Nearpush AXpush BXpush CXpush DX;---------输⼊提⽰--------------MOV BX, 0CLCMOV DX, 0;----------输⼊数字--------------Lp_0:MOV AH, 1INT 21HCMP AL, 20H ;回车JE L_CRLF;----- x belong to [0,9] ----------SUB AL, 30H ; ASCII -> intJL L_ERRORCMP AL, 9JG L_ERROR;------- string -> int -----------MOV AH, 0 ;将 AL扩展成 AXXCHG AX, BX ;保护 AX值MOV CX, 10MUL CX ; bx *= 10ADD AX , BXJC L_ERROR ; OVERFLOW处理XCHG AX, BXJMP Lp_0L_ERROR:MOV DX, 0MOV BX, 0CALL CRLF ; 换⾏CALL ERROR ; 输出错误提⽰JMP Lp_0L_CRLF: ; 以换⾏作为⼀个数的结束标志MOV DX, 0MOV DATA[SI], BX ;解析函数功能:本质类似于⾼精度计算,将读⼊的⼀个串转成数字存储在DATA数组中分成三⼤部分⼀:输⼊提⽰⼆:错误判断及提⽰三:转化为数字L_ERROR 错误处理L_CRLF 结束处理我们来举⼀个123412341234 的例⼦Register1234AX1234BX0112123CX10101010AX+(BX∗CX)AX + (BX * CX)AX+(BX∗CX)最后将结果存储在DATA数组⾥2.实现冒泡排序冒泡排序作为⼀个简单的排序算法,时间复杂度 O(n2)O(n^2)O(n2) 需要两层循环,为了提⾼代码的可读性,我们将内层的循环写成⼀个⼦程序每次调⽤内层循环很简单,每次从头⽐到尾,遇到⽐它⼩的交换就可以了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汇编语言程序
排序
对输入的多个数字进行排序。

要求:
(a)所有数字从键盘输入;
(b)数字中至少包含一个大于10的数字;
(c)排好序的数字以十进制形式在屏幕显示输出。

data segment
shuzi_w db 0
;shuzi_q db 0
;shuzi_b db 0
;shuzi_s db 0
;shuzi_g db 0 ;将排序好的数字显示出来,需要每一位转换成ASCII码
key DW 100 dup(0) ;输入的数的存放位置
buffer dw 0 ;输入数字的暂存位置输入的数字大于10 需要缓冲
n db 1 ; 总共输入的数字个数注意从1开始loop循环原因n1 db 1
; add your data here!
pkey db 'the programmer has been done ..' ,0dh,0ah,24h
string db 'please input data: ',0dh,0ah,24h
string1 db 0dh,0dh,0dh,0dh,'output: ',0dh,0ah,'$'
kongge db 0dh, 0ah,24h
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
; set segment registers:
xor ax,ax
push ax
mov ax, data
mov ds, ax
mov es, ax
lea dx , string
mov ah, 09h
int 21h ;显示请输入数据
mov di , offset key
mov ax , 0
mov buffer,ax
biaohao1: ;程序输入处
mov ah,08h ;键盘输入但不显示
int 21h ; 输入保存在AL中
cmp al,0dh; 输入是回车,直接结束输入
jz biaohao4
cmp al,'0' ;当输入的数在0到9中间时输入的是ASCII码jb biaohao2 ;不跳转否则跳转
cmp al,'9'
ja biaohao2
;若输入的数在0到9之间时
mov ah,2
mov dl,al ;显示此数
int 21h
sub al,30h
mov ah,0
push ax ; 保存刚输入的数字
mov bx,buffer
mov ax,10
mul bx ;ax=10*buffer
pop bx ; 将上面保存的ax 的值给bx
add ax,bx ;ax=10*buffer+bx(之前的ax) 输入的数字大于10
mov buffer,ax ;将ax 的值给buf
mov [di],ax ;若输入11,循环第一次输入是1,第二次重输入12
jmp biaohao1; 输入大于10 的数字的下一位
biaohao2: ;输入数字不是0到9
cmp al,20h ;输入是否是空格
je biaohao3 ;是的话跳出循环
jmp biaohao1 ; 不是的话继续输入下一位
biaohao3: ;是空格表示输入下一个数字
call konggexianshi ;屏幕上显示空格
add di,2 ;修改di指针,输入下一个数字
inc n ;输入的数字个数加一
mov ax,0
mov buffer,ax ;初始化
jmp biaohao1;继续输入下一个数字
biaohao4:
mov al,n
cmp al,0
jz qw ;没有输入数字就直接回车,结束程序call konggexianshi
call paixu
;数字显示部分
push dx
push ax
lea dx,string1
mov ah ,09h
int 21h
pop ax
pop dx
mov cx,0
mov cl, n
mov bx,offset key
disp:
mov dx,0; chushihua
mov ax,[bx]
call shujuxianshi
call konggexianshi
inc bx
inc bx
loop disp
;================================== paixu proc near
mov al,n
mov n1,al; 外循环、
loop1:
mov cl,n
mov ch,0;内循环
dec cx
mov bx,offset key
loop2:
mov ax,[bx]
cmp ax,[bx+2]
jna loop3 ;ax不大于bx+2,不交换
push ax
mov ax,[bx+2]
mov [bx],ax
pop ax
mov [bx+2],ax
loop3:
add bx,2
loop loop2
dec n1
jz paixuend
jmp loop1
paixuend:
ret
paixu endp
;=================================
konggexianshi proc near
push ax
push dx
mov ah,09
mov dx ,offset kongge
int 21h
pop dx
pop ax
ret
konggexianshi endp
;=====================================
xianshidangeshuzi proc near
push dx
push ax
mov dx,0
mov dl,al
xor ax,ax
mov ah,02h
int 21h
pop ax
pop dx
ret
xianshidangeshuzi endp
;=====================================
shujuxianshi proc near
push cx
push ds
mov cx,10000
div cx
push dx ;保存余数
mov shuzi_w,al
cmp shuzi_w,0
je j1
add al,30h
call xianshidangeshuzi
j1:
pop ax;取余数
mov dx,0
mov cx,1000
div cx
push dx;保存余数
mov shuzi_w,al
;add shuzi_w,al
cmp shuzi_w,0
;cmp shuzi_q,0
je j2
add al,30h
call xianshidangeshuzi
j2:
pop ax;取余数
mov dx,0
mov cx,100
div cx
push dx;保存余数
mov shuzi_w,al
; add shuzi_w,al
cmp shuzi_w,0
;cmp shuzi_b,0
je j3
add al,30h
call xianshidangeshuzi
j3:
pop ax;取余数
mov dx,0
mov cx,10
div cx
push dx;保存余数
mov shuzi_w,al
;add shuzi_w,al
cmp shuzi_w,0
;cmp shuzi_s,0
je j4
add al,30h
call xianshidangeshuzi
j4:
pop dx
add dl,30h
mov al,dl
call xianshidangeshuzi
xor ax,ax ;chushuhua
mov shuzi_w,al
; mov shuzi_q,al
; mov shuzi_b,al
; mov shuzi_g,al
pop ds
pop cx
ret
shujuxianshi endp
qw:
call konggexianshi
; add your code here
lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx
; wait for any key....
mov ah, 1
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
ends
end start ; set entry point and stop the assembler.。

相关文档
最新文档