微机原理上机作业汇编语言输入若干数字其中有大于十的从小到大排序【VIP专享】
汇编语言输入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<65536num < 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) 需要两层循环,为了提⾼代码的可读性,我们将内层的循环写成⼀个⼦程序每次调⽤内层循环很简单,每次从头⽐到尾,遇到⽐它⼩的交换就可以了。
汇编语言实现十个数的排序

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。
基于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。
汇编语言源程序,实现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个有符号整数,并按反序输出这些整数。
通过初始化键盘输入和屏幕输出,以及使用循环和指针操作,我们可以实现这个功能。
微机原理上机 汇编语言程序

上机作业四一.实验目的1.增强和提高汇编语言程序设计的能力,掌握模块化程序设计的方法.2.熟练掌握DOS常用功能的调用方法.二.试验仪器586微机一台三.实验内容编写如下程序,并在机器上调试成功。
程序采用菜单式选择,可以接收用户从键盘输入的五个命令(1-5),各命令功能分别为:(1)按下“1”键,完成字符串小写字母变成大写字母。
用户输入一由英文大小写字母或数字0-9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其他字符不变,并在屏幕上显示。
用户按任一键,重做,按ESC键,返回主菜单。
(2)按下“2”键,完成找最大值(二选一)。
a.接收用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来;b.接收用户输入若干个无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
(3)按下“3”键,完成排序(二选一)。
a.接收用户输入的可显示字符串,以回车结束。
程序按ASCII码值大小由大到小排序并输出显示;b.接收用户输入若干个有符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
(4)按下“4”键,显示时间。
首先提示用户对时,即用户输入时、分、秒(以空格或逗号为分隔符,以回车结束),然后,在屏幕上不断显示时间,格式为:XX(时): XX(分): XX(秒)最好定点显示。
用户按任一键,重新对时,按ESC键,返回主菜单。
(5)按下“5”键,结束程序运行,返回系统提示符。
四.程序代码STACK SEGMENT STACKDB 256 DUP(?)TOP LABEL WORDSTACK ENDSDA TA SEGMENTTABLE DW G1, G2, G3, G4, G5STRING1 DB '1. Change small letters into capital letters of string;', 0DH, 0AH, '$'STRING2 DB '2. Find the maximum of string;', 0DH, 0AH, '$'STRING3 DB '3. Sort for datas;', 0DH, 0AH, '$'STRING4 DB '4. Show Time;', 0DH, 0AH, '$'STRING5 DB '5. Exit.', 0DH, 0AH, '$'STRINGN DB 'Input the number you select (1-5) : $'IN_STR DB 'Input the string (including letters & numbers, less than 60 letters) :', 0DH, 0AH, '$' PRESTR DB 'Original string : $'NEWSTR DB 'New string : $'OUT_STR DB 'The string is $'MAXCHR DB 'The maximum is $'IN_NUM DB 'Input the numbers (0 - 255, no more than 20 numbers) : ', 0DH, 0AH, '$' OUT_NUM DB 'Sorted numbers : ', 0DH, 0AH, '$'IN_TIM DB 'Correct the time (HH:MM:SS) : $'HINTSTR DB 'Press ESC, go back to the menu; or press any key to play again!$' KEYBUF DB 61DB ?DB 61 DUP (?)NUMBUF DB ?DB 20 DUP (?)DA TA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA, SS:STACKSTART:MOV AX, DATAMOV DS, AXMOV AX, STACKMOV SS, AXMOV SP, OFFSET TOPMAIN: CALL FAR PTR MENU ; 设置显示器AGAIN:MOV AH, 2MOV BH, 0 ; 页号MOV DL, 41 ; 列号MOV DH, 10 ; 行号INT 10H ; 光标位置设置MOV AH, 1INT 21HCMP AL, '1'JB AGAINCMP AL, '5'JA AGAINSUB AL, '1' ; N-1SHL AL, 1 ; (N-1)*2CBW ; AL->AXLEA BX, TABLEADD BX, AXJMP WORD PTR [BX]G1:CALL FAR PTR CHGLTRMOV AH, 8INT 21HCMP AL, 1BHJZ MAINJMP G1G2:CALL FAR PTR MAXLTRMOV AH, 8INT 21HCMP AL, 1BHJZ MAINJMP G2G3:CALL FAR PTR SORTNUMMOV AH, 8INT 21HCMP AL, 1BHJZ MAINJMP G3G4:CALL FAR PTR TIMCHKMOV AH, 8INT 21HCMP AL, 1BHJZ MAINJMP G4G5:MOV AH, 4CHINT 21HMENU PROC FAR ; 显示主界面;设置显示器方式MOV AH, 0MOV AL, 3;MOV BL, 0;INT 10H ; 清屏MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 5 ; 行号INT 10H ; 光标位置设置MOV AH, 9LEA DX, STRING1INT 21HMOV AH, 2MOV DL, 5 ; 列号MOV DH, 6 ; 行号INT 10H ; 光标位置设置MOV AH, 9LEA DX, STRING2INT 21HMOV AH, 2MOV DL, 5 ; 列号MOV DH, 7 ; 行号INT 10H ; 光标位置设置MOV AH, 9LEA DX, STRING3INT 21HMOV AH, 2MOV DL, 5 ; 列号MOV DH, 8 ; 行号INT 10H ; 光标位置设置MOV AH, 9LEA DX, STRING4INT 21HMOV AH, 2MOV DL, 5 ; 列号MOV DH, 9 ; 行号INT 10H ; 光标位置设置MOV AH, 9LEA DX, STRING5INT 21HMOV AH, 2MOV DL, 5 ; 列号MOV DH, 10 ; 行号INT 10H ; 光标位置设置MOV AH, 9LEA DX, STRINGNINT 21HRETMENU ENDPCHGLTR PROC FAR ; 将输入字符串中小写字母便换成大写字母RECHG:;设置显示器方式MOV AH, 0MOV AL, 3MOV BL, 0INT 10H ; 清屏MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 5 ; 行号INT 10H ; 输入提示光标位置设置MOV AH, 9LEA DX, IN_STRINT 21H ; 输入字符串提示MOV AH, 2MOV DL, 5 ; 列号MOV DH, 6 ; 行号INT 10H ; 输入字符串光标位置设置MOV AH, 0AHLEA DX, KEYBUFINT 21H ; 输入字符串CMP KEYBUF + 1, 0JZ RECHG ; 判断输入字符串是否为空串LEA BX, KEYBUF + 2MOV AL, KEYBUF + 1CBWMOV CX, AXADD BX, AXMOV BYTE PTR [BX], '$' ; 在输入字符串尾加结束标志$MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 7 ; 行号INT 10H ; 源字符串提示光标位置设置MOV AH, 9LEA DX, PRESTRINT 21H ; 输出源字符串提示MOV AH, 9LEA DX, KEYBUF + 2INT 21H ; 输出源字符串LEA BX, KEYBUF + 2LCHG:CMP BYTE PTR [BX], 61HJB NOCHGAND BYTE PTR [BX], 0DFHNOCHG:INC BXLOOP LCHG ; 将字符串中小写字母转换成大写字母MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 8 ; 行号INT 10H ; 新字符串提示光标位置设置MOV AH, 9LEA DX, NEWSTRINT 21H ; 输出新字符串提示MOV AH, 9LEA DX, KEYBUF + 2INT 21H ; 输出新字符串MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 9 ; 行号INT 10H ; 提示信息光标位置设置MOV AH, 9LEA DX, HINTSTRINT 21H ; 输出提示信息RETCHGLTR ENDPMAXLTR PROC FAR ; 在输入字符串中找出最大值REMAX:;设置显示器方式MOV AH, 0MOV AL, 3MOV BL, 0INT 10H ; 清屏MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 5 ; 行号INT 10H ; 输入提示光标位置设置MOV AH, 9LEA DX, IN_STRINT 21H ; 输入字符串提示MOV AH, 2MOV DL, 5 ; 列号MOV DH, 6 ; 行号INT 10H ; 输入字符串光标位置设置MOV AH, 0AHLEA DX, KEYBUFINT 21H ; 输入字符串CMP KEYBUF + 1, 0JZ REMAX ; 判断输入字符串是否为空串LEA BX, KEYBUF + 2MOV AL, KEYBUF + 1CBWMOV CX, AXADD BX, AXMOV BYTE PTR [BX], '$' ; 在输入字符串位加结束标志$MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 7 ; 行号INT 10H ; 源字符串提示光标位置设置MOV AH, 9LEA DX, OUT_STRINT 21H ; 输出字符串提示MOV AH, 9LEA DX, KEYBUF + 2INT 21H ; 输出字符串MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 8 ; 行号INT 10H ; 新字符串提示光标位置设置MOV AH, 9LEA DX, MAXCHRINT 21H ; 输出字符串中最大值提示MOV DL, 0LEA BX, KEYBUF + 2LCMP:CMP [BX], DLJB NOLCHGMOV DL, [BX]NOLCHG:INC BXLOOP LCMP ; 找出字符串中最大字符,放入DLMOV AH, 2INT 21H ; 输出字符串中最大字符MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 9 ; 行号INT 10H ; 提示信息光标位置设置MOV AH, 9LEA DX, HINTSTRINT 21H ; 输出提示信息RETMAXLTR ENDPSORTNUM PROC FAR ; 对输入数据组排序RESORT:;设置显示器方式MOV AH, 0MOV AL, 3MOV BL, 0INT 10H ; 清屏MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 5 ; 行号INT 10H ; 输入提示光标位置设置MOV AH, 9LEA DX, IN_NUMINT 21HMOV AH, 2MOV DL, 5 ; 列号MOV DH, 6 ; 行号INT 10H ; 输入数据组光标位置设置MOV AH, 0AHLEA DX, KEYBUFINT 21H ; 输入数据组字符串CALL CIN_INT ; 字符串转换成数据串CMP AL, 0JZ RESORT ; 判断数据串是否有错CMP NUMBUF, 0JZ RESORT ; 判断数据串是否为空MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 7 ; 行号INT 10H ; 输出提示光标位置设置MOV AH, 9LEA DX, OUT_NUMINT 21H ; 输出数据串提示MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 8 ; 行号INT 10H ; 输出数据组光标位置设置CALL FAR PTR MPSORT ; 数据组排序CALL FAR PTR INT_OUT ; 数据组的输出MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 9 ; 行号INT 10H ; 提示信息光标位置设置MOV AH, 9LEA DX, HINTSTRINT 21H ; 输出提示信息RETSORTNUM ENDPCIN_INT PROC NEAR ; 读入整型数; 入口参数:无; 出口参数为:AL(有无错误标志,0为有,1为无)MOV CL, KEYBUF + 1LEA SI, KEYBUF + 2MOV CH, 0 ; 数据组数据个数置0MOV DH, 10MOV AL, 0 ; 当前数据x=0MOV DL, 0 ; 有无数据标志置0,即无数据FNDNUM:CMP BYTE PTR [SI], ' 'JZ ADDNUM ; 判断当前字符是否为空格CMP BYTE PTR [SI], '0'JB ERRNUMCMP BYTE PTR [SI], '9'JA ERRNUM ; 判断当前字符是否在'0'-'9'之间MOV DL, 1 ; 有无数据标志置1,即有数据MUL DHXOR BH, BHMOV BL, [SI]ADD AX, BXSUB AX, '0' ; 计算出当前数据xCMP AH, 0JA ERRNUM ; 判断x是否越界JMP NEXTADDNUM:CMP DL, 1JNZ NEXT ; 判断是否有数据INC CH ; 数据组数据个数加1CALL ADDNEWMOV DL, 0MOV AL, 0 ; 清零NEXT:INC SIDEC CLCMP CL, 0JNZ FNDNUM ; 依次检查各字符CMP DL, 1JNZ TOTAL ; 判断是否有未加入的数据INC CHCALL ADDNEWTOTAL:MOV NUMBUF, CH ; 置数据组数据个数MOV AL, 1 ; 输入数据无错误JMP CRTNUMERRNUM:MOV AL, 0 ; 输入数据有错误CRTNUM:RETCIN_INT ENDPADDNEW PROC NEAR ; 增加新数; 入口参数:CH(数据组数据个数)、AL(当前数据x); 出口参数:无PUSH AXLEA BX, NUMBUFMOV AL, CHCBWADD BX, AXPOP AXMOV [BX], ALRETADDNEW ENDPMPSORT PROC FAR ; 数据组排序MOV AL, NUMBUFCMP AL, 1JBE NOSORT ; 若只有一个元素,停止排序CBWMOV CX, AXLEA SI, NUMBUF ; SI指向数据组首地址ADD SI, CX ; SI指向数据组末地址DEC CX ; 外循环次数LP1: ; 外循环开始PUSH CXPUSH SIMOV DL, 0 ; 交换标志置0LP2: ; 内循环开始MOV AL, [SI]CMP AL, [SI - 1]JAE NOXCHGXCHG AL, [SI - 1] ; 交换操作MOV [SI], ALMOV DL, 1 ; 交换标志置1 NOXCHG:DEC SILOOP LP2POP SIPOP CXCMP DL, 1JNZ NOSORT ; 判断交换标志LOOP LP1NOSORT:RETMPSORT E NDPINT_OUT PROC FAR ; 输出数据组MOV AL, NUMBUFCBWMOV CX, AXMOV BL, 10HLEA SI, NUMBUF + 1PRINT:MOV AL, [SI]CALL OUTNUMINC SIMOV AH, 2MOV DL, ' 'INT 21HLOOP PRINTRETINT_OUT ENDPOUTNUM PROC NEAR ; 将十进制数以十六进制输出; 入口参数:AL(待转换的数据),BL(转换进制数16); 出口参数:无MOV AH, 0DIV BLPUSH AXCMP AH, 10JB PNUMADD AH, 7PNUM: ADD AH, 30HMOV DL, AHPOP AXPUSH DXCMP AL, 0JZ OUTNCALL OUTNUMOUTN:POP DXMOV AH, 2INT 21HRETOUTNUM ENDPTIMCHK PROC FAR ; 设定并显示时间;设置显示器方式MOV AH, 0MOV AL, 3;MOV BL, 0;INT 10H ; 清屏MOV AH, 2MOV BH, 0 ; 页号MOV DL, 5 ; 列号MOV DH, 6 ; 行号INT 10H ; 设置提示光标位置设置MOV AH, 9LEA DX, IN_TIMINT 21H ; 时间串提示MOV AH, 0AHLEA DX, KEYBUFINT 21H ; 输入时间串MOV BL, 10MOV AL, KEYBUF + 2SUB AL, '0'MUL BLADD AL, KEYBUF + 3SUB AL, '0'CMP AL, 0JB INV ALIDCMP AL, 24JAE INV ALID ; 判断时有效性MOV CH, ALMOV AL, KEYBUF + 5SUB AL, '0'MUL BLADD AL, KEYBUF + 6SUB AL, '0'CMP AL, 0JB INV ALIDCMP AL, 60JAE INV ALID ; 判断分有效性MOV CL, ALMOV AL, KEYBUF + 8SUB AL, '0'MUL BLADD AL, KEYBUF + 9SUB AL, '0'CMP AL, 0JB INV ALIDCMP AL, 60JAE INV ALID ; 判断秒有效性MOV DH, ALMOV DL, 0MOV AH, 2DHINT 21H ; 置系统时间INV ALID:CALL TIMERETTIMCHK ENDPTIME PROC ; 显示时间子程序;设置显示器方式MOV AH, 0MOV AL, 3;MOV BL, 0;INT 10H ; 清屏MOV AH, 2MOV BH, 0 ; 页号MOV DL, 10 ; 列号MOV DH, 9 ; 行号INT 10H ; 提示信息光标位置设置MOV AH, 9LEA DX, HINTSTRINT 21H ; 输出提示信息DISP1:MOV AH, 2MOV BH, 0 ; 页号MOV DL, 72 ; 列号MOV DH, 0 ; 行号INT 10H ; 提示光标位置设置MOV AH, 2CH ; 取系统时间,CH,CL,DH分别存放时/分/秒INT 21HMOV AL, CH ; 显示时CALL SHOWNUMMOV AH, 2MOV DL, ':'INT 21HMOV AL, CL ; 显示分CALL SHOWNUMMOV AH, 2MOV DL, ':'INT 21HMOV AL, DH ; 显示: 秒CALL SHOWNUMMOV AH,02H ; 设置光标位置MOV DX,090AHMOV BH,0INT 10HMOV BX,0018HRE: MOV CX,0FFFFH ; 延时REA: LOOP READEC BXJNZ REMOV AH, 0BH ; 或MOV AH, 01HINT 21H ; INT 16HCMP AL, 0 ; JE DISP1JZ DISP1 ; 检查键盘状态RETTIME ENDPSHOWNUM PROC ; 把AL中的数字以十进制输出; 入口参数:AL(待显示的数据); 出口参数:无CBWPUSH CXPUSH DXMOV CL, 10DIV CLADD AH, '0'MOV BH, AHADD AL, '0'MOV AH, 2MOV DL, ALINT 21HMOV DL, BHINT 21HPOP DXPOP CXRETSHOWNUM ENDPCODE ENDSEND START五.实验体会实验中遇到的问题以及解决方法:在这几次的编程实验中,我遇到了许多问题。
第三次汇编上机作业

微机原理上机实验报告(三)
班级:学号:姓名:
实验目的
(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单元中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.。