史上最牛最完整的汇编语言冒泡排序程序
汇编冒泡法排序
汇编实验报告实验题目:从键盘输入任意5个2位有符号十进制数,采用“冒泡法”进行升序排序,输出排序后的结果,并输出排序次数。
实验设计:实验要求用16位机的汇编语言完成,键盘上输入的的数据最终都会以ASCII码形式接受,输出也要求用ASCII码,因而我决定设计专门负责输入和输出的两个子程序。
但是由于要求输入的是有符号的而且是长度不一定不确定的十进制数,用一个子程序直接在输入时转换成二进制会比较麻烦,因而决定可以先以字符串的形式接受来自用户的数据,这样可以以最自由的形式接受数据,不仅数据长度问题可以解决,带不带‘+’‘-’符号也可以识别,而且方便查错。
排序的主要部分是比较简单的,学C的时候已经了解,况且数据结构课又重复了一遍,因而本次实验主要需要解决的还是输入输出、以及数据的转化问题。
我的程序结构比较简单,主要包含几个子程序:GET : 调用10号模块接收一串字符,放进缓存dataEXDTB:解析缓存中的符号数据,转化为二进制并存入数组ansEXBTD:对从BX传过来的二进制数解析,并在屏幕上输出相应的十进制数,无运算结果程序:DATAS SEGMENTDATA DB 21 DUP('$')ANS DW 10 DUP(0)TES DB 'RUN HRER','$'LEN DW 0TMP DW 0SIG DW 00HSTA DW 00H ;STA ANS[STA] IS DIGENT DB 0DH,0AH,'$'RNM DB 'READ 5 DIGITALS',0AH,0DH,'$'PRIT DB 'PAIXU:',0AH,0DH,'$'FINSH DB 'NEW ORDER:','$'EORR DB 'INPUT ERROR!',0AH,0DH,'$'CISHU DB 'EXCHANGE TIME:',0DH,0AH,'$'CIS DW 0EXIT DB 'ENTER A NUMBER TO EXIT',0AH,0DH,'$'DATAS ENDSSTACK SEGMENTTOPE DW 300H DUP(0)STACK ENDSCODES SEGMENTASSUME CS:CODES, DS:DATAS,SS:STACKSTART: ;先跳过写在开头的子程序MOV AX,DATASMOV DS,AXMOV AX,STACKMOV SS,AXMOV SP,00HJMP SART ;AH=09 OUPUT AH=10 INPUT,前面注意有两个字节没用从ds:dx+2开始才是 ;第一个是输入及字符数ENTE PROC ;ENTE DISPLAY '/N' ON THE SCREENPUSH AXPUSH DXMOV AX,OFFSET ENTMOV DX,AXMOV AH,09HINT 21HPOP DXPOP AXRETENTE ENDPGET PROC ;PROC GET READ A TWO BIT DIGITAL FROM USCERPUSH AX ;;DX HAS ADDRESSPUSH DXMOV DX,OFFSET DATAMOV AH,0AH ;GET A LINE OF NUMBERINT 21H;CALL ENTEPOP DXPOP AXRETGET ENDPEXDTB PROC ;PROC EXCHANGE SIGNED DIGITAL TO BINARYPUSH AXPUSH BXPUSH CXPUSH DX ;USE DX TO STORE ANS;ANS[STA] HAS RESULT XOR DX,DXXOR CX,CXMOV BX,OFFSET DATAINC BX ;DS:DX+1 IS THE NUMBER OF INPUTED CHAR MOV CL,[BX] ;cl HAS LENGTHXOR CH,CHINC BX ;NOW BX COME TO FIRST CHAR INPUTEDMOV AL,[BX]CMP AL,'-' ;TO CHECK IF IT IS SIGNJNZ POST ;WITHOUT '-',THAT WILL BE POSTIVEMOV WORD PTR[SIG], 0001H ;SET SIG 0001H IF NEGETIVE JMP SIGNEDPOST:MOV SIG,WORD PTR 0000H ;SET POSTIVECMP AL,'+' ;IF IT HAS '+',IGNORE ITJNE PASSSIGNED:INC BXSUB CX,01HJMP STLOP ;PASS THE SIGN + -PASS: ;DIRECTLY TO NUMBERSCMP AL,'0' ;IF IT IS NUMBERJL NOTHINGCMP AL,'9'JG NOTHINGMOV DL,ALSUB DL,'0'CMP CL,1JE POSTYSUB CX,01HSTLOP:MAINLOOP:MOV AL,[BX]SUB AL,'0'JS NOTHING ;JUMP IF AL-'0'< 0 , ILLEAGLE INPUT CMP AL,09H ;JUMP IF AL-'9'> 0 ,JG NOTHINGMOV DH,DL ;SHIFT DL TO TIMES 10SHL DH,01H ;SHIFT 2 TIMES 4SHL DH,01H ;DL=DL*4+DL=5*DLADD DL,DHSHL DL,01H ;DL=5*DL*2=10*DLADD DL,ALINC BXLOOP MAINLOOPTEST SIG,0001HJZ POSTY ;JUMP TO AVOID -DXNEG DLPOSTY:MOV BX,OFFSET ANSADD BX,STAMOV AL,DLCBWMOV [BX],AXJMP DONENOTHING: ;IF NOT NUMBER , RETURN 0MOV DX,OFFSET EORRMOV AH,09HINT 21HMOV BX,OFFSET ANSADD BX,STAMOV [BX],WORD PTR 0001HDONE:CALL ENTEPOP CXPOP BXPOP AXRETEXDTB ENDPEXBTD PROC ;PROC EXCHANGE BINARY NUMBER IN BX TO DIGITAL PUSH AXPUSH BXPUSH CXPUSH DXCALL ENTE ;DISPLAY '/N'TEST BX,8000HJZ POSTVMOV DL,'-'MOV AH,02HINT 21HNEG BX ;EXCHANGE TO POSTIVEPOSTV:MOV CX,1111HPUSH CXMOV AX,BXCWDMOV BX,10MLOOP:DIV BX ;DIV 10PUSH DX ;PUSH BX MOD 10CWDADD AX,00HJNZ MLOOPDSLOOP: ;DISPLAY NUMPOP DXCMP DX,1111HJE FINISHADD DL,'0'MOV AH,02HINT 21HJMP DSLOOPFINISH:;CALL ENTEPOP DXPOP CXPOP BXPOP AXRETEXBTD ENDPSART:MOV DX,OFFSET PRITMOV AH,09HINT 21HMOV DX,OFFSET RNMMOV AH,09INT 21HMOV CX,05HMOV WORD PTR[STA],0000HGETLOOP:CALL GET ;读入符号数CALL EXDTB ;转为二进制ADD WORD PTR[STA],0002H;存入数组ans LOOP GETLOOPMOV WORD PTR[CIS],00HARRAGE: ;排序MOV CX,05HSUB CX,0001HMOV BX,OFFSET ANSADD BX,CXADD BX,CXLOOP1:MOV TMP,CXPUSH BXLOOP2:MOV AX,WORD PTR[BX]SUB BX,0002HMOV DX,WORD PTR[BX]CMP AX,DXJNS BIGGERINC WORD PTR[CIS]MOV WORD PTR[BX],AXMOV 02H[BX],DXBIGGER:SUB WORD PTR[TMP],0001H JNZ LOOP2POP BXLOOP LOOP1WRITE: ;输出排好序的数MOV DX,OFFSET FINSHMOV AH,09HINT 21HMOV CX,05MOV WORD PTR[STA],0000HMOV BX,OFFSET ANSLOOPWR:PUSH BXADD BX,STAMOV DX,[BX]MOV BX,DXCALL EXBTDPOP BXADD WORD PTR[STA],0002HLOOP LOOPWRCALL ENTEMOV DX,OFFSET CISHUMOV AH,09HINT 21HMOV BX,[CIS]CALL EXBTDCALL ENTEMOV DX,OFFSET EXITMOV AH,09HINT 21HCALL GETMOV AX,4C00HINT 21HCODES ENDSEND START问题及调试:主要问题是数据的转化,当我们用C写程序时,直接可以用%开头的格式命令进行特定类型的数据输入输出,但是用汇编时就没有那么好办了,输入的时候要识别数据,输出也要转化数据。
冒泡排序语法
冒泡排序语法
冒泡排序(Bubble Sort)是一种简单的排序算法。
它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
下面是冒泡排序的Python语法:
Python
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j] # 交换元素
return arr
在这个函数中,外层循环控制所有的遍历过程,内层循环负责每次遍历中的元素比较和交换。
如果一个元素大于它后面的元素,那么这两个元素就会交换位置。
这样,最大的元素就像"冒泡"一样移到了数列的最后。
这个过程会重复进行,直到整个数列变得有序。
冒泡排序算法
编辑ppt
6
观察原数据与第一、二趟排序后的数据
序号 1 2 3 4 5 6 7 8 数据 49 38 65 97 76 13 27 49
序号 1 2 3 4 5 6 7 8 数据 38 49 65 76 13 27 49 97
序号 1 2 3 4 5 6 7 8 数据 38 49 65 13 27 49 76 97
第二趟排序的步骤: 序号 1 2 3 4 5 6 7 8 数据 38 49 65 7163 172367 274769 4796 97
38<494,保9<持65不,6保变5<持7不67,6变保>1持3不,7交6变>换27位, 置交76换7>64位<99置,7交, 保换持位不置变
经过第二趟排序,实把现第了二什大么的目数的沉?到倒数第二个位置了!
编辑ppt
i:= i +1
否 i >7
是
j:=j+1
否
j>7是
结束 12
思考交流:
在我们刚才的算法流程图中,每一趟的排序
我们都进行了7次,是否每一趟的排序都需 要进行7次比较呢?
那么现在请你对我们刚才画出的算法流程图
进行优化,设计出更好的流程图避免不必要 的工作。
编辑ppt
13
观察原数据与第一、二趟排序后的数据
49>384,9交<换65位, 6保置5<持9不7,变保9持7>不796变7,>交139换,7交>位29换置7,>位交49置换, 交位换置位置
第经对一过比趟第原排 一数序 趟据, 排经一序过共,第一进把趟行最排了大序多的,少数实次沉现比到了较最什? 底么了目!的?
编辑ppt
冒泡排序方法
冒泡排序方法冒泡排序是一种简单而基本的排序算法,它的原理是通过相邻元素的比较和交换来实现排序。
冒泡排序的思想是,每一轮遍历比较相邻的两个元素,如果它们的顺序错误就交换位置,将较大的元素往后移动。
通过多轮的遍历,最终将最大的元素移到了最后。
这个过程类似于气泡从水底冒到水面的过程,因此得名冒泡排序。
冒泡排序的实现非常简单,可以用几行代码来完成。
首先,我们需要一个待排序的数组。
然后,使用两个嵌套的循环来遍历数组,外层循环控制轮数,内层循环用于比较相邻元素并交换位置。
具体步骤如下:1. 遍历数组,比较相邻元素的大小。
2. 如果前一个元素大于后一个元素,则交换它们的位置。
3. 继续遍历,直到最后一个元素。
4. 重复上述步骤,直到所有元素都排好序。
冒泡排序的时间复杂度为O(n^2),其中n是数组的长度。
由于需要多次遍历和交换元素,冒泡排序在处理大规模数据时效率较低。
然而,冒泡排序的优点是实现简单、易于理解和调试,适用于小规模数据的排序。
冒泡排序的应用场景比较有限,一般用于教学和理解排序算法的基本原理。
在实际应用中,更常用的是其他高效的排序算法,例如快速排序、归并排序和堆排序等。
这些算法的时间复杂度更低,能够更快速地排序大规模数据。
冒泡排序在某些特殊情况下也可以优化。
例如,如果在一轮遍历中没有发生交换操作,说明数组已经完全有序,就可以提前结束排序。
这种优化策略称为“提前终止”。
此外,可以通过设置一个标志位来记录每轮遍历是否发生交换,如果没有交换则说明排序已经完成,也可以提前结束。
总结一下,冒泡排序是一种简单而基础的排序算法,通过多轮的相邻元素比较和交换来实现排序。
虽然其时间复杂度较高,但实现简单易懂。
在实际应用中,我们更常使用其他高效的排序算法来处理大规模数据。
对于理解排序算法的基本原理和教学目的,冒泡排序仍然是一个很好的选择。
史上最牛最完整的汇编语言冒泡排序程序
;题目:编制一个完整的汇编语言程序,从键盘上读入若干个(可以超过十个)十进制数(正数),排序后在屏幕上输出。
;采用冒泡法排序,综合运用子程序和宏汇编,使程序模块化。
;程序代码M_DIRECT MACRO STRING ;定义一个宏,调用09 号DoS功能在屏幕上显示一个字符串MoV DX,oFFSETAH,O921H STRINGMoVINTENDMDATA SEGMENTDIR1 DB 'count of numbers tosort:$ ' ;提示输入要排序的数据的个数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=1OOWTEMP DW ?ARRAY DW CoUNT DUP(?) ;用来保存输入的数据CRLF DB 13,1O, '$ ' ;实现回车换行的功能,13→ODH,回车;10→OAH,换行LENDW;保存实际输入的数据的个数DATA ENDSCoDE SEGMENTMAIN PRoC FARASSUME CS:CoDE,DS:DATASTART:PUSH DSSUBAX,AXPUSH ;置AX 为OAXMOVAX,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_DIRECT DIR2GETNUMBER: CALL P_GETNEW ; 输入数据并保存到ARRA 丫中MOV [BX],AXADD BX ,2LOOP GETNUMBERCX,LENSORT:; 排序程序部分MOV DEC CXMOV AH,09HLEA DX,CRLFINT21HM_DIRECT DIR5COMPARE:MOV AH,01HINT21HCMP AL,'U' ;判断是升序排序还是降序排序JZJMP;排序完后跳转到输出程序部分UP;输入的字符是U 或U 跳转到升序排序程序CMP AL, 'u'JZUPCMP'D';输入的字符是D 或d 跳转到降叙排序程序JZ DOWNCMPAL, 'd'JZDOWNUP:DI,CX; 升序排序程序MOVBX,0 LOOP1:MOVAX,ARRAY[BX]CMPAX,ARRAY[BX+2]JNGECONTINUE1XCHG AX,ARRAY[BX+2]MOVARRAY[BX],AXCONTINUE1: ADDBX,2LOOP LOOP1MOVCX,DILOOPUPJMPOUTPUT; 排序完后跳转到输出程序部分DOWN:DI,CX;降序排序程序MOVBX,0 LOOP2:MOVAX,ARRAY[BX]CMPAX,ARRAY[BX+2]JGECONTINUE2XCHG AX,ARRAY[BX+2]MOVARRAY[BX],AXAL,MOVMOVCONTINUE2:ADDBX,2LOOP LOOP2 MOV CX,DILOOP DOWNOUTPUTOUTPUT: MOV AH,09 ;回车换行LEA DX,CRLFINT 21HM_DIRECT DIR3CX,LENMOV;为输出程序设置好入口参数MOV BX,OFFSET ARRAYWRITE: MOV AX,[BX] 输出排好序的数据WTEMP,AXMOV;将入口参数存放到共享变量中CALL P_OUTPUTADD MOV DL,20H 开MOVINTLOOPBX,2; 显示空格,将两个输出的数据分AH,02H21HWRITEAH,09 AH,09MOVLEA DX,CRLFINT 21HM_DIRECTMOVLEA DX,CRLFINT 21HLOOP READRET;隔离两次输入排序输出的作用DIR4;实现循环输入数据并排序输出MAIN ENDP;从键盘上输入一个数据的子程序P_GETNEW PROCPUSH BX ; 出口参数:AX=补码表示的二进制数PUSH DXXORBX,BX ;BX 保存结果XORCX,CX;CX 为正负标志, 0为正, -1 为负MOVAH,1;输入一个字符INT21HCMPAL, '+'; 是“ +”,继续输入字符JZREAD1CMPAL, '-'; 是“—,设置 -1 标志JNZREAD2MOVCX,-1READ1:MOV AH,1; 继续输入字符INT21HREAD2:CMPAL, '0';不是 0~9 之间的字符,则输入数据结束JBREAD3CMPAL, '9'JAREAD3SUBAL,30H;是 0~9之间的字符,则转换为二进制数;利用移位指令,实现数值乘10: BX^BX*10SHLBX,1MOVDX,BXSHLBX,1SHLBX,1ADDBX,DXMOVAH,0ADDBX,AX; 已输入数值乘 10 后,与新输入的数值相加JMPREAD1; 继续输入字符READ3:CMP CX,0 ; 是负数,进行求补JZ READ4NEGBXREAD4:MOVAX,BX ; 设置出口参数POP DX;说明:负数用“-”引导,数据范围是 +32767~-32768PUSH CXPOP CXPOP BXRETP_GETNEW ENDP;子程序返回;用冒泡法排序的子程序(从大到小);P_SORT PROC;RET;子程序返回;P_SORT ENDP;数据输出子程序P_OUTPUT PROCWTEMPWRITE1:值)WRITE2: 推退出标志WRITE3:PUSH AX ;入口参数:共享变量PUSH BXPUSH DXMOV AX,WTEMP ;取出显示的数据TEST AX,AX ;判断数据是零、正书还是负数JNZ WRITE1MOV DL, '0' ;是‘ 0',显示‘ 0'后退出MOV AH,2INT 21HJMP WRITE5WRITE2 ; 是负数,显示“ -”MOV BX,AX ;AX 数据暂存于BXMOV DL, '-'MOV AH,2INT 21HMOV AX,BXNEG AX ;数据求补(绝对BX,10PUSH BX ;10 压入堆栈,做为AX,0 ;数据(商)为零,转向显示JZ WRITE4SUB DX,DX ;扩展被除数DX.AX JNSMOVCMP∏码后高位压入堆栈WRITE4: 弹出堆栈出WRITE5:DIVADDPUSHJMPPOP DXCMPJEMOVINTJMPPOP DXPOPPOPBXDL,30HDXWRITE3DL,10WRITE5AH,2 21HWRITE4MOVP_OUTPUTMOVINTRETENDPBXAXDL,20HAH,02H21HCODE ENDSEND START; 数据除以10;余数(0~9)转换为ASC;数据各位先低位;数据各位先高位后低位;是结束标志10,则退;进行显示;子程序返回。
冒泡排序 c语言
冒泡排序 c语言
冒泡排序是一种基本的排序方法,也是学习算法和数据结构的基础之一。
它的原理非常简单,就是不断地比较相邻的两个数,如果它们的顺序不对就交换它们的位置,直到所有的数都排好序为止。
在C语言中,冒泡排序的实现也很简单,可以通过两重循环来实现。
首先,外层循环控制排序的次数,一共需要进行n-1次排序,其中n是待排序数列的长度。
内层循环则负责比较和交换相邻的两个数,每次比较的范围都会缩小,因为每次排序都会将当前最大的数“沉”到数组的末尾。
下面是冒泡排序的C语言代码示例:
```c
void bubble_sort(int arr[], int n)
{
int i, j;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
```
这段代码中,arr是待排序数组的指针,n是数组的长度。
函数首先定义了两个循环变量i和j,分别表示当前排序的次数和当前比较的位置。
在内层循环中,如果相邻的两个数的顺序不对,就交换它们的位置,直到整个数组都排好序为止。
冒泡排序虽然简单,但是效率比较低,时间复杂度为O(n^2),在处理大规模的数据时会比较慢。
因此,在实际应用中,更多地采用其他高效的排序算法,比如快速排序、归并排序等。
8086汇编实现冒泡排序、直接插入排序、折半查找
(2)直接插入法 直接插入排序:将一个数据插入到一个已排好序的数据中,主要步骤如下:
① 查找应该插入的位置,这个过程免不了要比较数据的大小; ② 找到位置后,需将这个位置以及其后的数据都向后移动一位,空出此位置,等待插入 ③ 插入数据。
其 C 语言版的代码如下:
for(int i=2;i<=100;i++)
DSEG SEGMENT SCORE DB 31H,02H,15H,4H,5H,6H,7H,8H,9H,10H,90 DUP(05H) MAX DB ? MIN DB ?
DSEG ENDS CSEG SEGMENT
ASSUME DS:DSEG,CS:CSEG START: MOV AX,DSEG
MOV DS,AX
;相当于 i
L2: MOV AL,[BX+DI] ; L2 为内循环,(DI)为循环变量,相当于 j
CMP AH,AL
JAE L3
MOV DH,AH
;AH<Al,交换两个数
MOV AH,AL
MOV AL,DH
MOV [BX+DI],AL ;将交换后的数存入存储器
MOV [BX+SI],AH ;这两步很重要
L4: MOV DL,[BX+DI] ;从内存中取出 a[j],给(DL)
CMP DH,DL
;比较 a[0]和 a[j]
JAE L5
;a[0]<a[j],向后移
MOV [BX+DI+1],DL ;存入内存,实现真正的后移
DEC DI
;j--
JMP L4
L5: MOV [BX+DI+1],DH ;a[0]>=a[j],a[0]—>a[j+1],实现直接插入
冒泡排序的基本过程
冒泡排序的基本过程冒泡排序的基本过程可以分为以下几个步骤:1. 从第一个元素开始,依次比较相邻的两个元素,如果前面的元素大于后面的元素,则交换它们的位置,这样可以确保每一轮比较的过程中,较大的元素都会向数组的末尾“冒泡”。
2. 继续对剩余的元素进行相邻两两比较,直至最后一个元素,此时最大的元素已经被“冒泡”到数组的末尾。
3. 重复以上步骤,每一轮比较都会确定一个最大值的位置,并将其固定在最后,然后对剩余的元素进行比较和交换。
4. 继续进行若干轮比较,直至所有元素都按照从小到大(或从大到小)的顺序排列。
下面我们通过一个具体的例子来演示冒泡排序的基本过程:假设要对数组arr = [5, 3, 8, 2, 1, 7]进行升序排序,初始状态如下:第一轮比较:1. 比较arr[0]和arr[1],5 > 3,交换位置,数组变为 [3, 5, 8, 2, 1, 7]2. 比较arr[1]和arr[2],5 < 8,不交换位置,数组不变3. 比较arr[2]和arr[3],8 > 2,交换位置,数组变为 [3, 5, 2, 8, 1, 7]4. 比较arr[3]和arr[4],8 > 1,交换位置,数组变为 [3, 5, 2, 1, 8, 7]5. 比较arr[4]和arr[5],8 > 7,交换位置,数组变为 [3, 5, 2, 1, 7, 8]第一轮比较后,最大的元素8已经冒泡到数组的最后。
第二轮比较:1. 比较arr[0]和arr[1],3 < 5,不交换位置,数组不变2. 比较arr[1]和arr[2],5 > 2,交换位置,数组变为 [3, 2, 5, 1, 7, 8]3. 比较arr[2]和arr[3],5 > 1,交换位置,数组变为 [3, 2, 1, 5, 7, 8]4. 比较arr[3]和arr[4],5 < 7,不交换位置,数组不变5. 比较arr[4]和arr[5],7 < 8,不交换位置,数组不变第二轮比较后,第二大的元素7已经冒泡到数组的倒数第二个位置。
汇编冒泡排序程序
为掌握用汇编语言编写排序程序的思路和方法。
编写程序,在s中存放100个数,要求设计程序将这些数由小到大排序,排序后的数,仍放在该区域中,并显示排序后的结果。
DATA SEGMENTSTR1 DB 'PLEASE INPUT SOME DATA,THE END FLAG IS$','$'S DB 100DB ?DB 100 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA DX,STR1MOV AH,9INT 21HMOV DL,0AHMOV AH,2INT 21HLEA DX,SMOV AH,0AHINT 21HMOV SI,DXMOV DL,0AHMOV AH,2INT 21HMOV CL,[SI+1]MOV CH,0SUB CX,2MOV DX,CXDEC DXADD SI,2L1:MOV BL,[SI]INC SIMOV BH,[SI]CMP BH,BLJG L2MOV [SI],BLMOV [SI-1],BHL2:LOOP L1LEA SI,SADD SI,2MOV CX,DXDEC DXJNZ L1LEA DX,S ADD DX,2 MOV AH,9 INT 21HMOV AH,4CH INT 21H CODE ENDSEND START欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。
汇编实现冒泡排序的方法示例
汇编实现冒泡排序的⽅法⽰例冒泡排序算法的运作如下:(从后往前)1.⽐较相邻的元素。
如果第⼀个⽐第⼆个⼤,就交换他们两个。
2.对每⼀对相邻元素作同样的⼯作,从开始第⼀对到结尾的最后⼀对。
在这⼀点,最后的元素应该会是最⼤的数。
3.针对所有的元素重复以上的步骤,除了最后⼀个。
4.持续每次对越来越少的元素重复上⾯的步骤,直到没有任何⼀对数字需要⽐较。
以下为实现代码:S0 SEGMENT STACKDW 30 DUP(?)TOP LABEL WORDS0 ENDSS1 SEGMENTTIP DB "Input ten number and separate the numbers with space:", 0DH, 0AH, 24HARY DW 20 DUP(0)CRLF DB 0DH, 0AH, 24HN DW 0S1 ENDSS2 SEGMENTASSUME SS:S0, DS:S1, CS:S2, ES:S1P PROC FARMOV AX, S0MOV SS, AXLEA SP, TOPMOV AX, S1MOV DS, AXMOV AX, S1MOV ES, AXLEA DX, TIPMOV AH, 9INT 21HLEA SI, ARYXOR DX, DXMOV BL, 10MOV CX, 10INPUT: MOV AH, 1INT 21HCMP AL, 20H ;空格分隔字符JE SAVE;输⼊⼗进制数,将数存⼊SI对应的内存单元MOV DL, ALMOV AX, [SI]MUL BLSUB DL, 30HADD AL, DLMOV [SI], AXJMP INPUTSAVE:ADD SI, 2LOOP INPUT;数组保存完毕LEA SI, ARYMOV DI, SIADD DI, 2CMPA: MOV BX, [DI]CMP BX, [DI-2]JA CONMOV DX, [DI-2]PUSH DXMOV [DI-2], BXPOP DXMOV [DI], DXCON: ADD DI, 2DEC CHCMP CH, 0JNE CMPACALL PRINTMOV DI, SIADD DI, 2DEC CLMOV CH, CLCMP CL, 1JNE CMPA;以下为⼗进制输出ARY中的数EXIT: MOV AH, 4CHINT 21HP ENDPPRINT PROC NEARPUSH SIPUSH CXPUSH AXPUSH DXLEA DX, CRLFMOV AH, 9INT 21HLEA SI, ARYMOV CX, 10L1: MOV AX, [SI]MOV N, AXCALL OUTPUTADD SI, 2MOV DX, 20HMOV AH, 2INT 21HLOOP L1POP DXPOP AXPOP CXPOP SIRETPRINT ENDPOUTPUT PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXXOR CX, CXMOV AX, NMOV BX, 10L2: XOR DX, DXDIV BXPUSH DXINC CXL3: POP DXADD DX, 30HMOV AH, 2INT 21HLOOP L3POP DXPOP CXPOP BXPOP AXRETOUTPUT ENDPS2 ENDSEND P以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
用汇编语言冒泡排序经典程序
冒泡排序时间复杂度
最好情况:O(n)
平均情况:O(n²)
最坏情况:O(n²)
Part Two
汇编语言基础知识
汇编语言概述
汇编语言是一种低级编程语言,与机器语言相对应。
它使用助记符和操作码表示指令,易于理解和编写。
汇编语言通常用于嵌入式系统、操作系统等底层开发。
注意事项:确保编译和链接的正确性,避免出现错误和警告
工具使用:使用编译器和链接器等工具进行编译和链接
链接过程:将目标文件合并成一个可执行文件
程序运行及结果
输入数据:随机生成一组整数
程序运行过程:按照冒泡排序算法进行排序
输出结果:排序后的整数序列
测试结果:对多个不同规模的输入数据进行测试,验证程序的正确性和稳定性
代码注释:对每行代码进行详细解释,帮助理解算法实现过程
代码解析:分析代码结构,解释冒泡排序算法的汇编语言实现方式
寄存器使用:说明在汇编语言中如何使用寄存器进行数据交换和比较
优化点:分析代码中可以优化的地方,提高程序执行效率
Part Four
程序运行及测试
程序编译链接
编译过程:将源代码转换成机器语言
指令格式:汇编语言指令由操作码和操作数组成,操作码指明指令的操作类型,操作数指明操作数或操作数的地址。
伪指令:伪指令不是真正的计算机指令,而是用于告诉汇编程序如何组织程序的一种指示。常见的伪指令包括ORG、END、DB、DW等。
Part Three
汇编语言实现冒泡排序
排序数据准备
确定排序数据类型:根据具体需求选择合适的数据类型,如整数、字符等。
优化效果:通过减少数据交换次数,可以提高冒泡排序算法的执行效率,减少程序运行时间
汇编语言汇编语言实现ifwhilefor以及编写冒泡排序
汇编语言汇编语言实现ifwhilefor以及编写冒泡排序在计算机科学中,汇编语言是一种底层编程语言,它直接与计算机的硬件交互。
在汇编语言中,我们可以利用条件语句(if)、循环语句(while、for)以及排序算法(冒泡排序)来实现各种功能。
本文将介绍汇编语言中如何使用这些关键字来编写相应功能的代码,并且以冒泡排序算法为例进行详细说明。
一、if语句实现if语句在汇编语言中通常使用条件判断指令来实现。
下面是一个示例代码,演示如何使用if语句判断两个数的大小关系:```section .datanum1 db 10num2 db 20result db 0section .textglobal _start_start:mov al, byte[num1]mov bl, byte[num2]cmp al, bl ; 比较num1和num2的值jg greater ; 如果num1 > num2,则跳转到greater标签处jl less ; 如果num1 < num2,则跳转到less标签处jmp equal ; 如果num1 = num2,则跳转到equal标签处greater:mov byte[result], 1jmp doneless:mov byte[result], -1jmp doneequal:mov byte[result], 0jmp donedone:; 其他操作,比如打印结果或进行下一步操作```在上述代码中,我们将两个数分别存在`num1`和`num2`变量中,用`cmp`指令进行比较,根据比较结果使用`jmp`指令跳转到相应的标签位置。
通过这样的比较和跳转操作,我们可以实现基本的if语句功能。
二、while语句实现while语句在汇编语言中可以通过使用条件循环指令来实现。
下面是一个示例代码,演示如何使用while语句计算1到10的和:```section .datasum dw 0counter dw 1section .textglobal _start_start:mov cx, 10 ; 设置循环次数mov ax, 1 ; 设置计数器初始值loop_start:add word[sum], ax ; 将计数器的值加到sum中inc ax ; 计数器自增1loop loop_start ; 循环开始; 其他操作,比如打印结果或进行下一步操作```在上述代码中,我们将循环次数存储在`cx`寄存器中,将计数器的初始值存储在`ax`寄存器中。
简述冒泡排序的过程
简述冒泡排序的过程
冒泡排序是一种简单的排序算法。
它的基本思路是重复地遍历待
排序的序列,比较相邻的两个元素,如果顺序错误就交换它们的位置。
这样每次遍历它都会将一个最大值或最小值移到序列的末尾,直到整
个序列有序为止。
具体地,冒泡排序的过程如下:从序列的第一个元素开始,依次
比较相邻的两个元素,如果前面的元素比后面的元素大,则交换它们
的位置,直到将序列的最大元素移动到了序列的最后一个位置。
然后
再重复上述过程,但是这次只需要遍历到序列的倒数第二个位置,因
为最后一个元素已经是有序的了。
这样一次次地遍历下去,直到整个
序列有序为止。
当然,如果某次遍历中没有交换任何元素的位置,就
表示已经达到了有序状态,算法可以提前结束。
实现冒泡排序算法
实现冒泡排序算法算法步骤下面是冒泡排序算法的具体步骤:1. 从数组的第一个元素开始,依次比较相邻的两个元素的大小。
2. 如果前一个元素大于后一个元素,就交换它们的位置。
3. 继续向后比较,直到数组的末尾。
4. 每完成一次比较,最大的元素就会被移动到数组的末尾。
5. 重复上述步骤,直到整个数组有序。
代码实现下面是使用Python编写的冒泡排序算法的代码:def bubble_sort(arr):n = len(arr)for i in range(n-1):for j in range(n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]return arr测试代码arr = [5, 2, 8, 9, 1]print(bubble_sort(arr))示例解释首先,我们定义了一个名为`bubble_sort`的函数,它接受一个数组作为参数。
然后,我们使用嵌套的for循环来进行比较和交换操作。
外层的循环控制比较的轮数,内层的循环控制每轮中两两比较的次数。
如果前一个元素大于后一个元素,就交换它们的位置。
在测试代码中,我们定义了一个数组`arr`,并将其作为参数传递给`bubble_sort`函数。
然后,我们打印排序后的数组。
以上代码的输出结果为`[1, 2, 5, 8, 9]`,表示经过冒泡排序算法排序后的数组。
总结冒泡排序算法是一种简单但效率较低的排序算法,适用于小规模数据的排序。
它的基本思想是通过相邻元素的比较和交换,逐渐将最大的元素移动到数组的末尾。
尽管时间复杂度较高,但冒泡排序算法的实现比较简单,容易理解和实现。
> 注意:冒泡排序算法的时间复杂度为O(n^2),其中n表示数组的长度。
冒泡排序的算法
冒泡排序的算法
冒泡排序是一种简单的排序算法,它的基本思想是通过不断的比较相邻的两个元素,然后交换它们的位置,从而将最大或最小的元素逐步“冒泡”到数组的最顶端或最底端,达到排序的效果。
具体实现过程如下:
1. 从数组的第一个元素开始比较相邻的元素,如果前一个元素大于后一个元素,则交换它们的位置。
2. 继续从第一个元素开始比较相邻的元素,直到数组的最后一个元素。
3. 重复以上步骤,直到没有需要交换的元素为止,排序完成。
冒泡排序的时间复杂度为O(n^2),效率较低,但是它的实现简单易懂,在小规模数据排序时使用较为常见。
需要注意的是,在实际应用中,为了增加排序的效率,可以进行一些优化,例如设置一个标志变量来记录是否进行过交换操作,如果没有进行过,说明已经排序好了,可以直接退出循环。
此外,在每次循环中比较的范围也可以逐渐缩小,因为每一次循环都会将一个元素移动到它应该在的位置,因此比较的范围可以逐渐缩小,减少不必要的比较操作。
- 1 -。
史上最牛最完整的汇编语言冒泡排序程序
;题目:编制一个完整的汇编语言程序,从键盘上读入若干个(可以超过十个)十进制数(正数),排序后在屏幕上输出。
;采用冒泡法排序,综合运用子程序和宏汇编,使程序模块化。
;程序代码M_DIRECT MACRO STRING ;定义一个宏,调用09号DOS功能在屏幕上显示一个字符串MOV DX,OFFSET STRINGMOV AH,09INT 21HENDMDATA SEGMENTDIR1 DB 'count of numbers tosort:$ ' ;提示输入要排序的数据的个数DIR2 DB 'please input sortingnumbers:$ ';提示输入要排序的数据DIR3 DB 'sortingresult:$ ' ;在屏幕上提示排好续的数据DIR4 DB '*************************$ 'DIR5 DB 'please chooseu(up)ord(down):$ 'DIR6 DB 'input error$ 'COUNT = 100WTEMP DW ?ARRAY DW COUNTDUP(?) ;用来保存输入的数据CRLF DB 13,10,'$ ' ;实现回车换行的功能,13→0DH,回车;10→0AH,换行LENDW ? ;保存实际输入的数据的个数DATA ENDS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CODE SEGMENTMAIN PROC FARASSUME CS: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,CRLF INT21H ;屏幕提示输入要排序的数据M_DIRECT DIR2GETNUMBER: CALL P_GETNEW ;输入数据并保存到ARRAY中MOV [BX],AXADD BX ,2LOOP GETNUMBERSORT: 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]CMP AX,ARRAY[BX+2]JNGE CONTINUE1XCHG AX,ARRAY[BX+2]MOV ARRAY[BX],AXCONTINUE1: ADD BX,2LOOP LOOP1MOV CX,DILOOP UPJMPOUTPUT ;排序完后跳转到输出程序部分DOWN: MOV DI,CX ;降序排序程序MOV BX,0LOOP2: MOV AX,ARRAY[BX]CMP AX,ARRAY[BX+2]JGE CONTINUE2XCHG AX,ARRAY[BX+2]MOV ARRAY[BX],AXCONTINUE2: ADD BX,2LOOP LOOP2MOV CX,DILOOP DOWNJMPOUTPUT ;排序完后跳转到输出程序部分OUTPUT: MOV AH,09 ;回车换行LEA DX,CRLFINT 21HM_DIRECT DIR3MOVCX,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_DIRECT DIR4MOVAH,09 ;实现循环输入数据并排序输出LEA DX,CRLFINT 21HLOOP READRETMAIN ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;从键盘上输入一个数据的子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;P_GETNEW PROC PUSH BX ;出口参数:AX=补码表示的二进制数PUSH CX ;说明:负数用“-”引导,数据范围是+32767~-32768PUSH DXXOR BX,BX ;BX保存结果XOR CX,CX ;CX为正负标志,0为正,-1为负MOV AH,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 READ3SUB AL,30H ;是0~9之间的字符,则转换为二进制数;利用移位指令,实现数值乘10:BX←BX*10SHL BX,1MOV DX,BXSHL BX,1SHL BX,1ADD BX,DXMOV AH,0ADD BX,AX ;已输入数值乘10后,与新输入的数值相加JMP READ1 ;继续输入字符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 PROC PUSH AX ;入口参数:共享变量WTEMPPUSH BXPUSH DXMOV AX,WTEMP ;取出显示的数据TEST AX,AX ;判断数据是零、正书还是负数JNZ WRITE1MOV DL, '0' ;是‘0’,显示‘0’后退出MOV AH,2INT 21HJMP WRITE5WRITE1: JNS WRITE2 ;是负数,显示“-”MOV BX,AX ;AX数据暂存于BXMOV DL, '-'MOV AH,2INT 21HMOV AX,BXNEG AX ;数据求补(绝对值)WRITE2: MOV BX,10PUSH BX ;10压入堆栈,做为推退出标志WRITE3: CMP AX,0 ;数据(商)为零,转向显示JZ WRITE4SUB DX,DX ;扩展被除数DX.AX DIV BX ;数据除以10ADD DL,30H ;余数(0~9)转换为ASC Ⅱ码PUSH DX ;数据各位先低位后高位压入堆栈JMP WRITE3WRITE4: POP DX ;数据各位先高位后低位弹出堆栈CMP DL,10 ;是结束标志10,则退出JE WRITE5MOV AH,2 ;进行显示INT 21HJMP WRITE4WRITE5: POP DXPOP BXPOP AXMOV DL,20HMOV AH,02HINT 21HRET ;子程序返回P_OUTPUT ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CODE ENDSEND START。
简述冒泡法排序的基本步骤。
简述冒泡法排序的基本步骤。
冒泡排序是一种简单的排序算法,其基本步骤如下:
1.比较相邻两个元素的大小,如果前一个元素比后一个元素大,
则交换这两个元素的位置。
2.继续比较相邻的两个元素,直到将最后一个元素与倒数第二个
元素比较完毕。
3.对于所有未排序的元素,重复以上两个步骤,直到所有元素都
排好序。
具体来说,冒泡排序的过程如下:
1.从第一个元素开始,依次比较相邻的两个元素,如果前一个元
素比后一个元素大,则交换这两个元素的位置,直到将最后一个元素与倒数第二个元素比较完毕。
这一步会将最大的元素放在最后一个位置。
2.接下来,从第一个元素开始,依次比较相邻的两个元素,如果
前一个元素比后一个元素大,则交换这两个元素的位置,直到将倒数第二个元素与最后一个元素比较完毕。
这一步会将第二大的元素放在倒数第二个位置。
3.重复以上两个步骤,直到所有元素都排好序。
冒泡排序方法c语言
冒泡排序方法c语言冒泡排序方法(Bubble Sort)是一种简单且常用的排序算法,其原理是通过相邻元素的比较和交换来将最大(或最小)的元素逐步“冒泡”到序列的末尾。
本文将介绍冒泡排序的实现过程以及其优缺点。
冒泡排序的实现过程如下:1. 首先,将待排序序列看作是由n个元素组成的数组,其中第一个元素索引为0,最后一个元素索引为n-1。
2. 从左到右依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换这两个元素的位置。
3. 重复上述比较和交换的过程,直到数组的末尾。
此时,最大的元素已经被交换到了数组的末尾位置。
4. 重复执行上述步骤,但是忽略已经排序好的末尾位置,即每次比较和交换的元素数量逐渐减少。
5. 最终,当只剩下一个元素未排序时,整个序列就已经排好序了。
冒泡排序的时间复杂度是O(n^2),其中n是待排序序列的长度。
由于冒泡排序每次只能将一个元素移动到它最终的位置,因此需要进行n-1次比较和交换操作。
在最坏情况下,待排序序列是逆序的,需要进行n-1次比较和交换操作,因此时间复杂度为O(n^2)。
同时,冒泡排序是一种稳定的排序算法,即相等元素的相对位置在排序前后不发生变化。
尽管冒泡排序的时间复杂度较高,但它有一些优点和适用场景。
首先,冒泡排序的实现非常简单,容易理解和实现。
其次,当待排序序列长度较小时,冒泡排序的性能相对较好,因为它的比较和交换操作次数较少,而且额外的空间复杂度为O(1)。
因此,在一些小规模的排序问题中,冒泡排序仍然具有一定的应用价值。
然而,冒泡排序也存在一些缺点。
首先,由于其时间复杂度较高,当待排序序列长度较大时,冒泡排序的性能会明显下降。
其次,冒泡排序的比较和交换操作是相邻元素之间的比较和交换,因此在进行排序过程中,较远距离的元素交换需要多次比较和交换操作,导致排序效率较低。
为了改进冒泡排序的性能,可以引入一种优化策略,即设置一个标志位。
在每一轮比较和交换操作中,如果没有发生元素交换,则说明序列已经有序,可以提前结束排序过程。
用X86汇编写的冒泡排序程序
F:\MASM\TEMP\MP2.asm
2010年 6月 22日 21:01
CODESEG
MOV NUMBER[BX+1],AL NEXT_SMALL: LOOP LOOP_SMALL POP CX LOOP LOOP_BIG ;显示 MOV NUMBER[MAX],'$' LEA DX, NUMBER MOV AH, 09H INT 21H ;调试时使用,可去掉 MOV AH, 08H INT 21H ;结束 MOV AH, 4CH INT 21H ENDS END START
F:\MASM\TEMP\MP2.asm
2010年 6月 22日 21:01
;输入--排序--显示(字符串输入输出) MAX EQU 10;可改为要求的数字个数 ;数据段 DATASEG SEGMENT INPUT DB 128 DUP('0') NUMBER DB 128 DUP('0') DATASEG ENDS ;堆栈段 STACKSEG SEGMENT STACK DB 256 DUP(0) STACKSEG ENDS ;代码段 CODESEG SEGMENT ASSUME CS:CODESEG,SS:STACKSEG,DS:DATASEG START: ;初始化DS,SS MOV AX, DATASEG MOV DS, AX MOV ES, AX MOV AX, STACKSEG MOV SS, AX ;输入数据到INPUT LEA DX, INPUT MOV AL, MAX INC AL MOV INPUT[0], AL MOV AH, 0AH INT 21H ;换行 MOV DL, 0DH MOV AH, 02H INT 21H MOV DL, 0AH INT 21H ;将INPUT的内容装入NUMBER MOV CX, MAX LEA SI, INPUT SI ;INPUT从第三字节开始才是有效的字符 INC SI LEA DI, NUMBER CLD REP MOVSB ;排序 MOV CX, MAX ;外循环 LOOP_BIG: PUSH CX MOV CX, MAX DEC CX ;内循环 LOOP_SMALL: MOV BX, CX MOV AH, NUMBER[BX] DEC BX MOV AL, NUMBER[BX] CMP AH, AL JNC NEXT_SMALL MOV NUMBER[BX], AH