微机原理上机作业汇编语言输入若干数字其中有大于十的从小到大排序【VIP专享】
汇编语言输入10个数排序并输出的实现
![汇编语言输入10个数排序并输出的实现](https://img.taocdn.com/s3/m/3a23b90b2379168884868762caaedd3382c4b55c.png)
汇编语⾔输⼊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) 需要两层循环,为了提⾼代码的可读性,我们将内层的循环写成⼀个⼦程序每次调⽤内层循环很简单,每次从头⽐到尾,遇到⽐它⼩的交换就可以了。
汇编语言实现十个数的排序
![汇编语言实现十个数的排序](https://img.taocdn.com/s3/m/04a2e91f2e3f5727a5e962ed.png)
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用汇编语言实现的十个有符号数的排序(冒泡排序算法,输入为补码,从小到大)](https://img.taocdn.com/s3/m/ec35d9cd2cc58bd63186bd60.png)
提示:在做实验时,我们要自己将代码区和数据区分开,因为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个有符](https://img.taocdn.com/s3/m/44c2e62ea55177232f60ddccda38376bae1fe060.png)
汇编语言源程序,实现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个有符号整数,并按反序输出这些整数。
通过初始化键盘输入和屏幕输出,以及使用循环和指针操作,我们可以实现这个功能。
微机原理上机 汇编语言程序
![微机原理上机 汇编语言程序](https://img.taocdn.com/s3/m/25bfb836376baf1ffc4fad87.png)
上机作业四一.实验目的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五.实验体会实验中遇到的问题以及解决方法:在这几次的编程实验中,我遇到了许多问题。
第三次汇编上机作业
![第三次汇编上机作业](https://img.taocdn.com/s3/m/4e51e0f7700abb68a982fb5a.png)
微机原理上机实验报告(三)
班级:学号:姓名:
实验目的
(1)掌握比较指令、转移指令在分支程序设计中的使用方法。
(2)掌握分支结构程序的组成。
(3)掌握分支程序的设计、调试方法。
(4)熟悉DOS软中断及系统功能调用。
实验内容
从键盘上输入0-10之间的三个数字,比较其大小,完成三个数从大到小排序。
数的输入写了一个过程,把输入的三个数分别存入缓冲区。
输出显示也写了一个过程,先显示提示,然后按照从大到小的顺序输入显示缓冲区的三个数字。
提示:1.请用字母按键上方的键盘输入数字(不要使用键盘右侧的小键盘键入),以防程序运行错误。
2.输入的三个数字,分别放入AL、BL和CL中。
实验要求
请画出该分支程序排序过程的流程图,并且完善空白部分的源程序并补充分号后面的注释内容。
实验数据及结果
1.该分支程序排序过程的流程图
2.完整的程序源代码以及补充分号后面的注释内容:
3.程序输入数值以及运行程序后显示的结果:
实验过程中所遇到的问题及解决办法。
用汇编语言编写的排序程序
![用汇编语言编写的排序程序](https://img.taocdn.com/s3/m/a8f451065901020207409c5e.png)
用汇编语言编写的排序程序一实验目的 (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结果:。
汇编上机作业参考答案(
![汇编上机作业参考答案(](https://img.taocdn.com/s3/m/10292e29b42acfc789eb172ded630b1c58ee9b49.png)
汇编上机作业参考答案(上机作业实验题目: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单元中。
微机原理上机作业汇编语言输入若干数字,其中有大于十的,从小到大排序
![微机原理上机作业汇编语言输入若干数字,其中有大于十的,从小到大排序](https://img.taocdn.com/s3/m/44a800a082d049649b6648d7c1c708a1284a0a8e.png)
微机原理上机作业汇编语言输入若干数字,其中有大于十的,从小到大排序汇编语言程序排序对输入的多个数字进行排序。
要求:(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.。
【资料汇编】微机原理上机作业-编写8086汇编程序-将寄存器AX的高8位传送到寄存
![【资料汇编】微机原理上机作业-编写8086汇编程序-将寄存器AX的高8位传送到寄存](https://img.taocdn.com/s3/m/940585550b4c2e3f57276378.png)
上机作业1、编写8086汇编程序,将寄存器AX的高8位传送到寄存器BL,AX的低8位传送到寄存器DL。
CODE SEGMENTASSUME CS:CODESTART:MOV BL,AH;寄存器AX的高8位传送到寄存器BLMOV DL,AL ;AX的低8位传送到寄存器DLINT 20H ;结束CODE ENDSEND START2、将DX寄存器的内容从低位到高位顺序分成4组,且将各组数分别送到寄存器AL、BL、CL和DL。
MOV AL,0MOV BL,0MOV CL,04ADD AL,DLADD BL,DLAND AL,0FHAND BL,0F0HSHL BL,CLMOV CL,0ADD CL,DHADD DL,DHAND CL,0FHAND DL,0F0HMOV AH,CLMOV CL,4SHL DL,CLMOV CL,AH3、判断MEN单元的数据,编程将奇数存入MENA单元,将偶数存入MENB单元。
DATAS SEGMENTMEN DW 11H,12H,13H,14H,15H,16HMENA DW 5 DUP (?)MENB DW 5 DUP (?)DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AXMOV CX,6MOV SI,OFFSET MENAA1: MOV BX,[SI]INC SITEST BX,0001HJZ AA2MOV MENA,BXLOOP AA1AA2:MOV MENB,BXINC SILOOP AA1MOV AH,4CHINT 21HCODES ENDSEND START4、试统计9个数中的偶数的个数,并将结果在屏幕上显示。
DATAS SEGMENTDATA DB 1,4,5,13,16,21,28,35,41;DATAS ENDSSTACKS SEGMENT;STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATASMOV DS,AXMOV CX,9MOV DX,0LEA SI,DATAPANDUAN:MOV AL,[SI]SHR AL,1JC NEXTINC DLNEXT:INC SILOOP PANDUANCMP CX,0JNZ PANDUANMOV AH,02HADD DL,30HINT 21H;MOV AH,4CHINT 21HCODES ENDSEND START5、试将一串16位无符号数加密,加密方法是将每个数乘2。
微机原理-实验一-汇编语言-冒泡排序
![微机原理-实验一-汇编语言-冒泡排序](https://img.taocdn.com/s3/m/6c40c250a2161479171128c5.png)
微机原理实验报告班级: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在存储器地址末尾没变。
微机原理实验报告——字符串排序
![微机原理实验报告——字符串排序](https://img.taocdn.com/s3/m/85c9263e5727a5e9856a6183.png)
一、实验名称:字符串排序二、实验目的:⑴学习利用系统功能调用的“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_循环程序设计实验](https://img.taocdn.com/s3/m/ddb360233968011ca3009196.png)
微机原理与汇编语言实验实验三循环程序设计实验一实验目的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寄存器中。
输入10整数,并按从小到大的顺序输出。
![输入10整数,并按从小到大的顺序输出。](https://img.taocdn.com/s3/m/e40fb8d433687e21af45a9d6.png)
《C语言程序设计》上机报告3专业班级:学号:姓名:指导教师:完成日期:11月22日一、实验题目与目的1. 实验题目:应用数组解决大量同类数据的问题。
2. 实验目的:掌握数组和循环语句相结合的应用,加深对数组的理解。
二、实验环境与要求1. 实验环境:Visual C++6.02. 实验要求:综合运用《C语言程序设计》中所学知识,理解数组的定义,数组元素的引用及数组的基本使用。
能够在C语言环境下,运用数组类型与循环语句相结合解决实际问题。
三、实验内容1.应用传统流程图描述算法2.应用数组和循环语句编写简单的程序四、代码实现及运行结果1.题目输入10整数,并按从小到大的顺序输出。
2.算法描述3.源程序代码#include<stdio.h>#define N 10main( ) {int i,j,a[N],t;int min_a;for (i=0;i<N;i++)scanf("%d",&a[i]);for(i=0;i<N-1;i++){min_a=i;for(j=i+1;j<N;j++)if (a[j]<a[min_a])min_a=j;if(min_a!=i) {t=a[min_a];a[min_a]=a[i];a[i]=t;} }printf("\nAfter sorted: "); for (i=0;i<N;i++)printf("%5d",a[i]); }。
微机原理与接口技术实验56-
![微机原理与接口技术实验56-](https://img.taocdn.com/s3/m/ca5651343968011ca3009168.png)
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个无符号数的大小](https://img.taocdn.com/s3/m/82aed720f61fb7360a4c653b.png)
利用汇编语言编写求10个无符号数的大小利用汇编语言编写求10个无符号数的大小一、要求:已知在DATA开始的字单元中存放有,,个无符号整数,试编制程序挑选出其中的最大数并存放到MAXV单元中~挑选出最小数并存放到MINV单元中。
二算法分析1、求最大值:10个数据存储在限制为10个数据的数组中~BX中存储数组~将首地址数据赋值给AX,随后完成指针后移同时数据循环与AX比较~如果AX<[BX],那么 AX赋值给BX~否则指针后移~直到指针指到数组末尾时循环结束~最后将AX赋值给MAXV~然后调用DOS输出数据。
2求最小值:将首地址数据赋值给AX,随后完成指针后移同时数据循环与AX比较~如果AX>[BX],那么 AX赋值给BX~否则指针后移~直到指针指到数组末尾时循环结束~将AX赋值给MAXV~然后调用DOS输出数据。
三扩展应用顾名思义~此程序的设计是为了在无序的一组数据中挑选出其最值。
在实际中~这样的要应用许许多多~这样~我们可以把这个算法付诸实践~丰富我们的乐趣~使我们的程序设计从理论上升到实践~从而能力得到质的飞跃。
设想~再一次歌手比赛中~评委打完分后~计分原则是去头和尾~此时~本程序可以迅速查找到其最高分以及最低分~并删除之~这是一个很好的应用。
再看看我们的学校~每年必不可少的就是考试了~为了各项评比~我们需要选出最高分~无论怎么评比~只要设置一个关键字~定义其属性就可以得到最优秀的~这一应用节省了我们的时间~对比过去利用“穷举”的查找法~这无疑是质的飞跃啊:在软件中~可以用这种算法来实现数据、字符等的寻优操作。
总之~只要没有到共产主义社会~就会就会存在竞争~就存在优胜劣汰~从而少不了的就是选择更优秀~淘汰垃圾~那么查找最优或者最差的算法就不会淘汰。
四程图分析设计:程序分为查找、排序的主程序~以及它所要调用的循环程序~程序中包含有延时子程序~主程序为循环结构~以便循环比较~查找到最值。
史上最牛最完整的汇编语言冒泡排序程序
![史上最牛最完整的汇编语言冒泡排序程序](https://img.taocdn.com/s3/m/41f70d90ddccda38366bafc1.png)
;题目:编制一个完整的汇编语言程序,从键盘上读入若干个(可以超出十个)十进制数(正数),排序后在屏幕上输出. 之五兆芳芳创作;采取冒泡法排序,综合运用子程序和宏汇编,使程序模块化. ;程序代码M_DIRECT MACRO STRING ;定义一个宏,调用09号DOS功效在屏幕上显示一个字符串MOV DX,OFFSET STRINGMOV AH,09INT 21HENDMDATA SEGMENTDIR1 DB 'count of numbers to sort:$ ' ;提示输入要排序的数据的个数DIR2 DB 'please input sorting numbers:$ ';提示输入要排序的数据DIR3 DB 'sorting result:$ ' ;在屏幕上提示排好续的数据DIR4 DB'*************************$ 'DIR5 DB 'please choose u(up)ord(down):$ 'DIR6 DB 'input error$ 'COUNT = 100WTEMP DW ?ARRAY DW COUNT DUP(?) ;用来保管输入的数据CRLF DB 13,10, '$ ' ;实现回车换行的功效,13→0DH,回车;10→0AH,换行LENDW ?;保管实际输入的数据的个数DATA ENDS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CODE SEGMENTMAIN PROC FARASSUMECS:CODE,DS:DATASTART:PUSH DSSUBAX,AX ;置AX为0PUSH AXMOVAX,DATA ;将数据段的地址送到DX中MOV DS,AXREAD: M_DIRECT DIR1 ;宏调用,在屏幕上提示输入要输入的数据的个数CALLP_GETNEW ;调用子程序P-GETNEW,输入要输入的数据的个数MOV CX,AXMOV LEN,AXLEA BX,ARRAYMOVAH,09 ;调用09号功效,实现回车换行LEA DX,CRLFINT21H ;屏幕提示输入要排序的数据M_DIRECTDIR2GETNUMBER: CALL P_GETNEW ;输入数据并保管到ARRAY中MOV [BX],AXADD BX ,2LOOP GETNUMBER SORT: MOV CX,LEN ;排序程序部分DEC CXMOV AH,09HLEA DX,CRLFINT 21HM_DIRECT DIR5COMPARE:MOV AH,01HINT 21HCMP AL, 'U' ;判断是升序排序仍是降序排序JZUP ;输入的字符是U或u 跳转到升序排序程序CMP AL, 'u'JZ UPCMP AL, 'D' ;输入的字符是D或d跳转到降叙排序程序JZ DOWNCMP AL, 'd'JZ DOWNUP: MOV DI,CX ;升序排序程序MOV BX,0LOOP1: MOV AX,ARRAY[BX]CMPAX,ARRAY[BX+2]JNGE CONTINUE1XCHGAX,ARRAY[BX+2]MOVARRAY[BX],AXCONTINUE1: ADD BX,2LOOP LOOP1MOV CX,DILOOP UPJMPOUTPUT ;排序完后跳转到输出程序部分DOWN: MOV DI,CX ;降序排序程序MOV BX,0LOOP2: MOV AX,ARRAY[BX]CMPAX,ARRAY[BX+2]JGE CONTINUE2XCHGAX,ARRAY[BX+2]MOVARRAY[BX],AXCONTINUE2: ADD BX,2LOOP LOOP2MOV CX,DILOOP DOWNJMPOUTPUT ;排序完后跳转到输出程序部分OUTPUT: MOV AH,09 ;回车换行LEA DX,CRLFINT 21HM_DIRECTDIR3MOVCX,LEN ;为输出程序设置好入口参数MOV BX,OFFSET ARRAYWRITE: MOV AX,[BX] ;输出排好序的数据MOVWTEMP,AX ;将入口参数存放到同享变量中CALL P_OUTPUTADD BX,2MOVDL,20H ;显示空格,将两个输出的数据分隔MOV AH,02HINT 21HLOOP WRITEMOVAH,09 ;隔离两次输入排序输出的作用LEA DX,CRLFINT 21HM_DIRECTDIR4MOVAH,09 ;实现循环输入数据并排序输出LEA DX,CRLFINT 21HLOOP READRETMAIN ENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;从键盘上输入一个数据的子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;P_GETNEW PROCPUSHBX ;出口参数:AX=补码暗示的二进制数PUSHCX ;说明:正数用“-”引导,数据规模是+32767~-32768PUSH DXXORBX,BX ;BX保管结果XORCX,CX ;CX为正负标记,0为正,-1为负MOVAH,1 ;输入一个字符INT 21HCMP AL, '+' ;是“+”,持续输入字符JZ READ1CMP AL, '-' ;是“—,设置-1标记JNZ READ2MOV CX,-1READ1: MOV AH,1 ;持续输入字符INT 21HREAD2: CMP AL, '0' ;不是0~9之间的字符,则输入数据结束JB READ3CMP AL, '9'JA READ3SUBAL,30H ;是0~9之间的字符,则转换为二进制数;利用移位指令,实现数值乘10:BX←BX*10SHL BX,1MOV DX,BXSHL BX,1SHL BX,1ADD BX,DXMOV AH,0ADDBX,AX ;已输入数值乘10后,与新输入的数值相加JMPREAD1 ;持续输入字符READ3: CMP CX,0 ;是正数,进行求补JZ READ4NEG BXREAD4: MOV AX,BX ;设置出口参数POP DXPOP CXPOP BXRET ;子程序前往P_GETNEW ENDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;用冒泡法排序的子程序(从大到小);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;P_SORT PROC;RET;子程序前往;P_SORT ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;数据输出子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;P_OUTPUT PROCPUSH AX ;入口参数:同享变量WTEMPPUSH BXPUSH DXMOV AX,WTEMP ;取出显示的数据TEST AX,AX ;判断数据是零、正书仍是正数JNZ WRITE1MOV DL, '0' ;是‘0’,显示‘0’撤退退却出MOV AH,2INT 21HJMP WRITE5WRITE1: JNS WRITE2 ;是正数,显示“-”MOVBX,AX ;AX数据暂存于BXMOV DL, '-'MOV AH,2INT 21HMOV AX,BXNEGAX ;数据求补(绝对值)WRITE2: MOV BX,10PUSHBX ;10压入堆栈,做为推退出标记WRITE3: CMP AX,0 ;数据(商)为零,转向显示JZ WRITE4SUB DX,DX ;扩展被除数DX.AXDIVBX ;数据除以10ADD DL,30H ;余数(0~9)转换为ASCⅡ码PUSHDX ;数据列位先低位后高位压入堆栈JMP WRITE3WRITE4: POP DX ;数据列位先高位后低位弹出堆栈CMP DL,10 ;是结束标记10,则退出JE WRITE5MOVAH,2 ;进行显示INT 21HJMP WRITE4WRITE5: POP DXPOP BXPOP AXMOV DL,20HMOV AH,02HINT 21HRET ;子程序前往P_OUTPUT ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CODE ENDSEND START。
- 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.。