用汇编语言冒泡排序经典程序

合集下载

史上最牛最完整的汇编语言冒泡排序程序

史上最牛最完整的汇编语言冒泡排序程序

;题目:体例一个完备的汇编谈话步调,从键盘上读进若搞个(不妨超出十个)十进造数(正数),排序后正在屏幕上输出. 之阳早格格创做;采与冒泡法排序,概括使用子步调战宏汇编,使步调模块化. ;步调代码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。

汇编--BubbleSort(冒泡排序)

汇编--BubbleSort(冒泡排序)

一、实验目的1. 掌握循环程序的设计方法;2. 了解循环结构在程序中的重要作用起泡排序程序。

二、实验原理及基本技术路线图(方框原理图)循环结构分DO_WHILE和DO_UNTIL两种,无论使用哪种循环结构,循环程序一般应包括以下几部分:①循环初始化。

它包括设置循环次数的初始值、地址指针的初始设置等。

②循环体。

这是循环工作的主体,包括要重复执行的操作,以及循环的修改部分。

修改部分包括地址指针的修改、循环控制条件的修改等。

③循环控制部分。

它是控制循环的关键,判断循环条件满足与否。

特别要注意循环入口和循环次数的正确设置、地址指针及循环控制条件的修改等。

否则会得不到期望的结果。

以下为冒泡算法的流程图:三、所用仪器、材料(设备名称、型号、规格等)1. 操作系统平台:Windows Server 20032. 汇编环境:Microsoft MASM 5.03. 文本编辑器:记事本四、实验方法、步骤1. 将MASM5.0的文件置于C:\assembly\目录下;2. 将masm.exe和link.exe所在目录(C:\assembly\MASM5)添加到Path环境变量中;3.在C:\assembly\下新建一个bubble.asm文件,打开bubble.asm,输入汇编程序代码;4. 运行一个命令行窗口,将当前目录切换到C:\assembly\,然后输入命令:masm bubble.asm [Enter],来汇编程序,根据汇编结果查看程序代码是否有语法错误,如有,则更正保存后重新汇编,直至没有错误为止,此时会生成bubble.obj文件;5. 输入命令:link bubble.obj [Enter],观察输出结果,如果没有错误,则生成bubble.exe;6. 输入命令:debug bubble.exe [Enter],调试程序,并记录运行过程;7. 完成实验报告。

五、实验过程原始记录(数据、图表、计算等)1. 将C:\assembly\MASM5目录添加到Path环境变量中:2. 新建名为bubble.asm的文件,输入汇编程序代码:程序源码:STACKSG SEGMENT STACK 'S'DW 64 DUP('ST')STACKSG ENDSDATA SEGMENTARY DW 5,7,1,4,3,6,9,8,2 ;数组,流程图中为ACT EQU ($-ARY)/2 ;元素个数DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA, SS:STACKSG MAIN PROC FARMOV AX,DATAMOV DS,AXMOV DI,CT-1 ;初始化外循环次数LOP1: MOV CX,DI ;置内循环次数MOV BX,0 ;置地址指针LOP2: MOV AX,ARY[BX]CMP AX,ARY[BX+2] ;两数比较JGE CONT ;次序正确转XCHG AX,ARY[BX+2] ;次序不正确互换位置MOV ARY[BX],AXCONT: ADD BX,2 ;修改地址指针LOOP LOP2 ;内循环控制DEC DI ;修改外循环次数JNZ LOP1 ;外循环控制MOV AX,4C00HINT 21HMAIN ENDPCODE ENDSEND MAIN3. 汇编源程序:4. 连接生成可执行文件:5.调试程序:(1)初始化外循环次数(DI)=0008H(2)置内循环次数和地址指针(3)第一趟第一次比较,因为5<7,故互换位置,进行下一次比较(5)修改地址指针,继续内循环(6)第一趟第二次比较,因为5>1,故直接更改地址指针,进行下一次比较(7)第一趟第三次比较,因为1<4,故互换位置,进行下一次比较(8)第一趟第四次比较,因为1<3,故互换位置,进行下一次比较(9)第一趟第五次比较,因为1<6,故互换位置,进行下一次比较(10)第一趟第六次比较,因为1<9,故互换位置,进行下一次比较(11)第一趟第七次比较,因为1<8,故互换位置,进行下一次比较(12)第一趟第八次比较,因为1<2,故互换位置(13)第一趟循环结束,最小数1被交换至数组的最后位置(14)第二趟循环结束,次小数2被交换至数组的倒数第二个位置(15)第三趟循环结束,数字3归位(16)第四趟循环结束,数字4归位(17)第五趟循环结束,数字5归位(19)第七趟循环结束,数字7归位(20)第八趟循环结束,数字8归位(22)排序结束,程序退出六、实验结果、分析和结论(误差分析与数据处理、成果总结等。

汇编冒泡法排序

汇编冒泡法排序

汇编实验报告实验题目:从键盘输入任意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写程序时,直接可以用%开头的格式命令进行特定类型的数据输入输出,但是用汇编时就没有那么好办了,输入的时候要识别数据,输出也要转化数据。

汇编语言冒泡排序

汇编语言冒泡排序

汇编语⾔冒泡排序终于可以看懂很简单很简单的汇编语⾔代码了,很有成就感^^下⾯是⼀冒泡排序的汇编语⾔代码。

先对代码简要说明⼀下:像“NEXT0:”,以字符串加冒号构成的是⼀个标签,翻译成汇编指令时会⽤偏移地址替代。

原数据放在SOURCE代表的内存单元中,排序后的数据放在RESULT代表的内容单元中。

在冒泡算法中,有两层循环,其中,寄存器BX控制外层循环,CX控制内层循环。

N EQU 4STAC SEGMENT STACKDB 128 DUP (?)STAC ENDSDATA SEGMENTSOURCE DW 7003h,7002h,7008h,7001hRESULT DW N DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA, SS:STACSTART PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXLEA SI,SOURCELEA DI,RESULTMOV CX,NNEXT0: MOV AX,[SI]MOV [DI],AXADD SI,2ADD DI,2LOOP NEXT0CLDMOV BX,N-1MAL1: LEA SI,RESULTMOV CX,BXNEXT: LODSWCMP [SI],AXJAE CONTXCHG [SI],AXMOV [SI-2],AXCONT: LOOP NEXTDEC BXJNZ MAL1RETSTART ENDPCODE ENDSEND START这段代码经过link后⽣成的汇编指令如下:14C1:0000 1E PUSH DS14C1:0001 33C0 XOR AX,AX14C1:000350 PUSH AX14C1:0004 B8C014 MOV AX,14C014C1:0007 8ED8 MOV DS,AX14C1:0009 8D360000 LEA SI,[0000]14C1:000D 8D3E0800 LEA DI,[0008]14C1:0011 B90400 MOV CX,000414C1:0014 8B04 MOV AX,[SI]14C1:00168905 MOV [DI],AX14C1:0018 83C602 ADD SI,+0214C1:001B 83C702 ADD DI,+0214C1:001E E2F4 LOOP 001414C1:0020 FC CLD14C1:0021 BB0300 MOV BX,000314C1:0024 8D360800 LEA SI,[0008]14C1:0028 8BCB MOV CX,BX14C1:002A AD LODSW14C1:002B 3904 CMP [SI],AX14C1:002D 7305 JNB 003414C1:002F 8704 XCHG AX,[SI]14C1:0031 8944FE MOV [SI-02],AX 14C1:0034 E2F4 LOOP 002A14C1:0036 4B DEC BX14C1:0037 75EB JNZ 002414C1:0039 CB RETF14C1:003A 0000 ADD [BX+SI],AL 14C1:003C 0000 ADD [BX+SI],AL 14C1:003E 0000 ADD [BX+SI],AL。

ARMC语言调用汇编函数实现冒泡排序

ARMC语言调用汇编函数实现冒泡排序

ARMC语⾔调⽤汇编函数实现冒泡排序使⽤冒泡排序将指定数组排序后输出排序函数使⽤汇编语⾔编写,C语⾔调⽤汇编语⾔在控制台显⽰排序前后的结果⼀、问题分析本程序的关键是如何使⽤汇编语⾔实现冒泡排序算法。

可以仿照C语⾔的代码流程,分步骤写出汇编的代码。

⾸先要写出最内层的代码部分,也就是数据交换的汇编代码,数据交换可以使⽤str数据装载指令实现。

之后要考虑内层循环的代码,可以通过cmp指令控制循环次数。

最后是编写最外层的循环代码,也是使⽤cmp指令,来控制整个排序的次数。

⼆、代码编写2.1 C语⾔代码#include <stdio.h>extern void sort(char* num, int count);int main(){char number[10] = {'a', 'c', 'b', 'e', 'd', 'f', 'h', 'g', 'j', 'i'};printf("Before: %s\n", number);sort(number, 10);printf("After: %s\n", number);return 0;}C语⾔中⽐较重要的是,⾸先要声明外部函数sort,也就是由汇编代码实现的函数。

其代码流程为:初始化1个10字节的char类型的数组在控制台输出初始化的数据调⽤汇编函数进⾏排序显⽰排序后的结果2.2 汇编代码area sort, code, readonlyglobal sortstartmov r2, #-1 ; r2->i, i=-1sub r8, r1, #1 ; r1->countloopcmp r2, r8 ; 控制外层循环bge stopadd r2,r2, #1 ; i=i+1mov r3, #-1 ; r3=j, j=-1loop0add r3, r3, #1 ; j=j+1add r4, r3, #1 ; r4=j+1sub r7, r8, r2 ; 控制内层循环cmp r3, r7bge loopldrb r5, [r0, r3] ; r5=a[j]ldrb r6, [r0, r4] ; r6=a[j+1]cmp r5, r6 ; ⽐较 a[j] 和 a[j+1]blt loop0swapstrb r5, [r0, r4] ; 交换 a[j] 和 a[j+1]strb r6, [r0, r3]b loop0stopend汇编语⾔代码是仿照的C语⾔的冒泡排序流程实现的,其⼤致流程为:⾸先初始化R2,R2⽤来控制外层循环的次数。

史上最牛最完整的汇编语言冒泡排序程序

史上最牛最完整的汇编语言冒泡排序程序

;题目:编制一个完整的汇编语言程序,从键盘上读入若干个(可以超过十个)十进制数(正数),排序后在屏幕上输出。

;采用冒泡法排序,综合运用子程序和宏汇编,使程序模块化。

;程序代码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,则退;进行显示;子程序返回。

1冒泡排序的ARM汇编程序

1冒泡排序的ARM汇编程序

1冒泡排序的ARM汇编程序ORG 09B0HQUE:MOV R3,#50H QUE1:MOV A,R3 MOV R0,AMOV R7,#0AHCLR 00HMOV A,@R0Q12:INC R0MOV R2,ACLR CMOV 22H,@R0CJNE A,22H,Q13 SETB CQ13:MOV A,R2JC Q11SETB 00HXCH A,@R0DEC R0XCH A,@R0INC R0Q11:MOV A,@R0 DJNZ R7,Q12JB 00H,QUE1SJMP $END2 ARM汇编希尔排序法对10个带符号数进行排序Code:void shell(int src[],int l,int r){int ih;r++;for(ih=1;ih<(r-l)/9;ih=ih*3+1);//eax,ih//ebx,il//ecx,ir//edx,cmps_asm{push eaxpush ebxpush ecxpush edxpush esipush edi;貌似这堆进栈用处不大哎mov edi,srcmov eax,dword ptr [ih]LIH:cmp eax,0jna EXIHmov ebx,eaxdec ebxLLH:cmp ebx,dword ptr [r]jnb EXLLHmov ecx,ebxmov edx,dword ptr [edi+ecx*4]LCMP:mov esi,eaxdec esicmp ecx,esijna EXCMPpush ecxsub ecx,eaxcmp edx,dword ptr [edi+ecx*4] pop ecxjnb EXCMPpush ebxpush ecxsub ecx,eaxmov ebx,dword ptr [edi+ecx*4] pop ecxmov dword ptr [edi+ecx*4],ebx pop ebxsub ecx,eaxjmp LCMPEXCMP:mov dword ptr [edi+ecx*4],edx inc ebxjmp LLHEXLLH:push ecxmov ecx,3push edxcdqidiv ecxpop edxpop ecxjmp LIHEXIH:pop edipop esipop edxpop ecxpop ebxpop eax}}351单片机C语言对流水灯编程,用定时中断做#include<reg52.h>define uchar unsigned charuchar m=0,i=0;void main(){ TMOD|=0x01; //定时器0工作方式为1TH0=(65536-50000)/256; //装初值TL0=(65536-50000)%256; EA=1; //开总中断ET0=1; //开定时器中断TR0=1; //开启定时器while(1); //等待中断}void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256; m++ ;if(m==5) //12M晶振定时5*50MS=250MS{m=0;P1=~(0X01<<i);//P1接8个LEDif(++i==8) i=0;}}4单片机编程C语言和汇编都可以。

汇编:汇编语言实现冒泡排序(loop指令实现)

汇编:汇编语言实现冒泡排序(loop指令实现)

15 CODES SEGMENT
16 ASSUME CS:CODES, DS:DATAS
17 START:
18
mov AX,DATAS
;待排序的内容的段地址
19
mov DS,AX
20
21
mov bx,offset buffer ;待排序的内容的偏移地址
22
mov si,0 ;外层循环起始下标0
23
xor cx,cx
网络错误503请刷新页面重试持续报错请尝试更换浏览器或网络环境
汇编:汇编语言实现冒泡排序( loop指令实现)
1 ;===============================
2 ;循环程序设计
3 ;loop指令实现
4 ;冒泡排序
5 ;for(int i=0;i<N;i++){
6 ; for(int h=0;j<N-1-i>;j++){
35 next1:
36
inc di
37
loop flag2
38
pop cx
;内层循环完毕时 出栈
39 next2:
40
inc si
41
loop flag142Βιβλιοθήκη 43 exit:44
mov ah,4ch
45
int 21H
46 CODES ends
47 end START
48 ;=====================
24
mov cl,10 ;设置外层循环次数
25
26 flag1:
27
mov di,0 ;内层循环起始地址下标0
28
push cx
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

data segment
A dw 03h, 0dh, 08h, 1dh, 20h, 0fdh
;两个字节保存一个值,对应十进制的3,13,8,29,32,253
data ends
code segment
main proc far
assume cs:code, ds:data
start:
push ds
sub ax, ax ;ax寄存器清零
push ax
mov ax, data
mov ds, ax
mov cx, 7
dec cx ;减1指令
loop1: ;cx=cx-1若cx!=0则继续循环
mov di, cx
;把CX寄存器的值传送到以DS寄存器(默认是DS寄存器)的内容为段值有效地址为DI 的存储单元中
mov bx, 0
loop2:
mov ax, a[bx] ;把第bx个数传给ax寄存器
cmp ax, a[bx+2] ;比较第bx个数和第bx+2个数
jle continue ;jle:小于等于则跳转,否则执行下句
xchg ax, a[bx+2] ;否则两比较数交换位置
mov a[bx], ax
continue:
add bx, 2
loop loop2
mov cx, di
loop loop1
mov cx, 7
mov bx, 0
next:
mov ax, [bx]
push cx
call show
pop cx
mov ah, 2
mov dl, ' '
int 21h
add bx, 2
loop next
ret
main endp
show: ; 显示ax里的值
mov cx, 10
cmp ax, 0
jle done
div cl ;除法:被除数在DX,AX中,除数在cl中
push ax
xor ah, ah ;xor实现两个操作数按位‘异或’运算,结果送至目的操作数中
call show
pop dx
mov dl, dh
or dl, 30h ;或运算
mov ah, 2
int 21h
done:
ret
code ends
end start。

相关文档
最新文档