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

合集下载

risc-v汇编 对5个整数的排序

risc-v汇编 对5个整数的排序

risc-v汇编对5个整数的排序在RISC-V汇编语言中,对5个整数进行排序可以使用简单的冒泡排序算法。

以下是一个示例代码:```assembly# 定义5个整数.datanum1 .word 5num2 .word 3num3 .word 7num4 .word 1num5 .word 6# 定义排序函数.text.globl _start_start:# 将5个整数存储到寄存器中la a0, num1 # a0 -> num1la a1, num2 # a1 -> num2la a2, num3 # a2 -> num3la a3, num4 # a3 -> num4la a4, num5 # a4 -> num5# 调用冒泡排序函数jal sort_bubble# 打印排序后的结果li v0, 1 # 系统调用码:输出整数li t0, 10 # t0 -> 10 (要打印的数字)syscall # 执行系统调用li v0, 10 # 系统调用码:退出程序syscall # 执行系统调用# 冒泡排序函数sort_bubble:# 将5个整数从内存中复制到寄存器中lw a0, 0(a0) # a0 -> num1lw a1, 0(a1) # a1 -> num2lw a2, 0(a2) # a2 -> num3lw a3, 0(a3) # a3 -> num4lw a4, 0(a4) # a4 -> num5# 对5个整数进行冒泡排序sort_loop:# 比较a0和a1,如果a0大于a1,则交换它们的位置blt a0, a1, end_sort_loop # 如果a0小于a1,则跳转到end_sort_loopsw a0, 0(a1) # 将a0的值存储到a1所指向的内存中sw a1, 0(a0) # 将a1的值存储到a0所指向的内存中jr a6 # 返回地址:跳转到sort_loop: (返回值是a6)end_sort_loop: # 结束比较和交换操作jr a6 # 返回地址:跳转到sort_loop: (返回值是a6)jr a6 # 返回地址:跳转到sort_loop: (返回值是a6)jr a6 # 返回地址:跳转到sort_loop: (返回值是a6)jr a6 # 返回地址:跳转到sort_loop: (返回值是a6)jr a6 # 返回地址:跳转到sort_loop: (返回值是a6)jr ra # 返回地址:跳转到调用者(返回值是ra)```。

汇编冒泡法排序

汇编冒泡法排序

汇编实验报告实验题目:从键盘输入任意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。

基于8086用汇编语言实现的十个有符号数的排序(冒泡排序算法,输入为补码,从小到大)

基于8086用汇编语言实现的十个有符号数的排序(冒泡排序算法,输入为补码,从小到大)

提示:在做实验时,我们要自己将代码区和数据区分开,因为8086上没有软件帮我们完成这个任务。

MOV R0,#218 //之所以选择208这个大点的地址,是因为避免将数据写到了代码区LOOP1:IN //将数据读入AADD A,#128 //将补码转换为其对应的移码,因为补码本身参与加减不能比较出大//小,而移码就是将其真值在数轴上平移了2的n次方MOV @R0,AMOV A,R0sub a,#1SUB A,#208 //判断有没有输入完10个数JZ LOOP2 //输入完数据,跳转ADD A,#208MOV R0,AJMP LOOP1//没有输入完,就跳回接着输入LOOP2:MOV R0,#9 //9轮循环比较就可以排完序MOV R1,#209MOV R2,#210LOOP4:MOV A,@R2SUBC A,@R1JC LOOP3 //若210地址指向的单元中的数比209地址指向的单元中的小,则交//换LOOP5:MOV A,R2ADD A,#1SUBC A,#219 //判断此轮有没有比较完JZ LOOP6 //若比较完,就跳到LOOP6,否则继续比较ADD A,#219MOV R2,AJMP LOOP4LOOP3:MOV A,@R1MOV 208,AMOV A,@R2MOV @R1,AMOV A,208MOV @R2,AJMP LOOP5 //交换完了就跳回LOOP6: MOV A,R1ADD A,#1MOV R1,AADD A,#1MOV R2,A //让R2始终指向的是R1下一个单元MOV A,R0SUB A,#1JZ LOOP7 //判断9轮比较有没有完成,若完成,跳LOOP7,否则,继续比//较MOV R0,AJMP LOOP4LOOP7: MOV R0,#218LOOP9: MOV A,@R0 //下面这一段代码就是将数还原,因为原来我们是那人家的移码//形式来比较的,相信下面这一段就不用多讲了吧ADD A,#128MOV @R0,AMOV A,R0sub a,#1SUB A,#208JZ LOOP8ADD A,#208MOV R0,AJMP LOOP9LOOP8:END。

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

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

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

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

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

arm汇编之冒泡排序

arm汇编之冒泡排序

arm汇编之冒泡排序开始在ADS里面写程序后,发现自己之前对于X86汇编的学习完全归还给了我的老师门。

最直接的便是要写一个从小到大的冒泡排序。

冒泡排序的思想我想就不用赘述了。

以前c语言遍的应该很多了。

算法不成问题,可是数据结构知道是数组,可是数组在arm汇编里面该在怎么定义了?其实,还真感觉又要从零开始了。

X86的汇编已经完全归还给了我敬爱的微机原理老师。

网上看到了一个广为流传的冒泡排序,既然写不出来,那就先学习它的精髓,说不定还能为我所用了。

代码详细的看了看。

具体翻译如下:AREA Sort,CODE,READONLY :首先用AREA伪代码加上CODE,表明下面引出的将是一个代码段,ENTRY 和END成对出现,说明他们之间的代码是程序的主体ENTRY:表示代码的开始Start MOV r4,#0 :将0赋值给r4LDR r6,=src :在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同样的,当src变量代表一个数组时,需要r0寄存器指向src 则需要这样赋值:LDR r0,=src 当格式是LDR r0,[r2],则第二个参数表示寄存器,我的理解是符号表示取内容,r2本身表示一个寄存器地址,取内容候将其存取r0这个寄存器中跳转到LDR R0,[R1]将存储器地址为R1的字数据读入寄存器R0 LDRR0,[R1,#8]将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1,此句是将数据src的首地址赋值给R6ADD r6,r6,#len:R6为数组的最后一个数组元素的地址。

数组这时是连续分配的。

Outer LDR r1,=src:将src地址即数组元素首地址赋值给R1Inner LDR r2,[r1] :将存储器地址为r1的字数据读入r2 LDR r3,[r1,#4]:将存储器地址为R1+4的字数据读入R3 CMP r2,r3 :比较R2,R3STRGT r3,[r1]:若大于,则将R3中的字数据写入以R1为地址的存储器中STRGT r2,[r1,#4]:若大于,则将R2中的字数据写入以R1+4为地址的存储器中ADD r1,r1,#4:R1+4赋值给R1 CMP r1,r6:R1与R6比较BLT Inner:若是有符号数小于,即R1<R6,则跳转到Inner行执行ADD r4,r4,#4:R4+4赋值给R4 CMP r4,#len:R4与len比较SUBLE r6,r6,#4 :若有符号数小于或等于,则R6-4赋值给R6 BLE Outer :若有符号数小于或等于,则跳转到OuterStop MOV r0,#0x18 , stop一段是用来是程序退出的,第一个语句“MOV r0,#0x18”将r0赋值为0x18,这个立即数对应于宏angel_SWIreason_ReportException。

汇编语言-冒泡排序

汇编语言-冒泡排序

汇编语⾔-冒泡排序数组排序1. 题⽬:将⼀个数组的所有元素排序后输出2.要求:给定⼀个数组,数组包含10个整型元素,将其按照从⼩到⼤的顺序排列后输出,要求排序的算法⽤⼦程序来实现。

例如,输⼊的数组元素为1,3,-9,5,12,0,-3,-12,24,34,那么输出是:-12,-9,-3,0,1,3,5,12,24,34。

1; Example assembly language program --2; Author: karllen3; Date: revised 5/201445 .3866 .MODEL FLAT78 ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD910 INCLUDE io.h ; header file for input/output1112 cr EQU 0dh ; carriage return character13 Lf EQU 0ah ; line feed1415 .STACK 4096; reserve 4096-byte stack1617 .DATA18 i DWORD ?19 j DWORD ?20 temp DWORD ?21 promot1 BYTE "Please Enter ten numbers to sort from min to max",cr,Lf,022 array DWORD 10 DUP(?)23 promot2 BYTE "The numbers that are sorted is",cr,Lf,024 value BYTE 11 DUP(?)25 BYTE cr,Lf,02627 .CODE2829 sortArray PROC NEAR3230push ebp ;建⽴堆栈31mov ebp,esp3233mov i,034mov edx,1035; mov ebx,[ebp+8] ;取得数组地址36sortFirst:37mov ebx,[ebp+8]38inc i39cmp i,940jg endsortFirst ;⼤于9则跳转,4142sub edx,i ;求edx-i43mov j,044sortSecond:45inc j46cmp j,edx47jg endsortSecond ;⼤于10-i则转移48mov eax,[ebx]49mov ecx,[ebx+4]5051cmp eax,ecx ; cmp [ebx],[ebx+4]52jl endCMP ;[ebx]<[ebx+4]则转移5354mov edx,eax55mov [ebx],ecx56mov [ebx+4],edx575859;swap60endCMP:61add ebx,462mov edx,1063jmp sortSecond6465endSortSecond:66jmp sortFirst67endsortFirst:6869pop ebp70ret7172 sortArray ENDP7374_start:7576 output promot177mov ecx,078lea ebx,array7980doFirstWhile:81inc ecx82cmp ecx,1083jg endFirstWhile ;⼤于10则结束8485 input value,1186 atod value87mov [ebx],eax88add ebx,489jmp doFirstWhile90endFirstWhile:9192lea eax,array93push eax94call sortArray95add esp,49697 output promot298mov ecx,099lea ebx,array100101doSecondWhile:102inc ecx103cmp ecx,10104jg endSecondWhile105 dtoa value,[ebx]106 output value107add ebx,4108jmp doSecondWhile109110endSecondWhile:111112 INVOKE ExitProcess, 0; exit with return code 0 113114 PUBLIC _start ; make entry point public 115116 END ; end of source code。

单片机用51汇编实现冒泡

单片机用51汇编实现冒泡

单片机作业题目要求:用冒泡排序法实现将一组无序的数据从小到大的排列(本人设计的程序实现的是8个无序数字的排序)。

程序设计:程序实现(已做详细注释):;================================================; 文件名称: Asm2.asm; 功能描述: 冒泡排序,升序;================================================ORG 0000H ;程序的加载地址LJMP MAIN ;程序加载后执行的第一条语句,即跳刀main 函数ORG 0100H ;;MAIN: MOV R0,#07H ;MOV 20H,#34H ;把数据存到起始地址为20H的内存中MOV 21H,#23H ;把数据存到起始地址为21H的内存中MOV 22H,#89H ;把数据存到起始地址为22H的内存中MOV 23H,#30H ;把数据存到起始地址为23H的内存中MOV 24H,#22H ;把数据存到起始地址为24H的内存中MOV 25H,#01H ;把数据存到起始地址为25H的内存中MOV 26H,#20H ;把数据存到起始地址为26H的内存中MOV 27H,#86H ;把数据存到起始地址为27H的内存中MOV 28H,#38H ;把数据存到起始地址为28H的内存中MOV 29H,#76H ;把数据存到起始地址为29H的内存中LOOP1: MOV R1,#20H ;R1指向数据首地址MOV A,R0 ;MOV R2,A ;把进行一次冒泡的次数存到R2中LOOP2: MOV A,@R1 ;比较开始,取第一个数MOV R3,A ;简单的转存一下前一个数,腾出累加器; AINC R1 ; 指向下一个地址SUBB A,@R1 ;取后一个数,并与前一个数相减,看是否有CY位溢出,溢出则说明前一个数小,要换位JC LOOP3 ;前一个数小的情况下,两个数交换位置,否则,继续执行MOV A,R3 ;把后一个数存到累加器下XCH A,@R1 ;累加器的数与R1指向的数交换;位置,即;前一个数和后一个数交; 换位置DEC R1 ;R1自减,准备将后面的数存到前面MOV @R1,A ;将后面的数存到前面INC R1 ;R1自增,准备下次转换LOOP3: DJNZ R2,LOOP2 ;R2自减,为下次冒泡准备DJNZ R0,LOOP1 ;跳回去进行下一轮冒泡SJMP $ ;程序结束END程序调试:1.单步调试,展示内存中存入的无序的数据存入时的代码:MOV 20H,#34H ;把数据存到起始地址为20H的内存中MOV 21H,#23H ;把数据存到起始地址为21H的内存中MOV 22H,#89H ;把数据存到起始地址为22H的内存中MOV 23H,#30H ;把数据存到起始地址为23H的内存中MOV 24H,#22H ;把数据存到起始地址为24H的内存中MOV 25H,#01H ;把数据存到起始地址为25H的内存中MOV 26H,#20H ;把数据存到起始地址为26H的内存中MOV 27H,#86H ;把数据存到起始地址为27H的内存中可以看到已存内存中的数完全无序。

8086汇编实现冒泡排序、直接插入排序、折半查找

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],实现直接插入

汇编语言汇编语言实现ifwhilefor以及编写冒泡排序

汇编语言汇编语言实现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表示数组的长度。

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

用汇编语言冒泡排序经典程序
交换位置:如果前一个元素比后一个元素大,则交换它们的位置
冒泡排序时间复杂度
最好情况:O(n)
平均情况:O(n²)
最坏情况:O(n²)
Part Two
汇编语言基础知识
汇编语言概述
汇编语言是一种低级编程语言,与机器语言相对应。
它使用助记符和操作码表示指令,易于理解和编写。
汇编语言通常用于嵌入式系统、操作系统等底层开发。
注意事项:确保编译和链接的正确性,避免出现错误和警告
工具使用:使用编译器和链接器等工具进行编译和链接
链接过程:将目标文件合并成一个可执行文件
程序运行及结果
输入数据:随机生成一组整数
程序运行过程:按照冒泡排序算法进行排序
输出结果:排序后的整数序列
测试结果:对多个不同规模的输入数据进行测试,验证程序的正确性和稳定性
代码注释:对每行代码进行详细解释,帮助理解算法实现过程
代码解析:分析代码结构,解释冒泡排序算法的汇编语言实现方式
寄存器使用:说明在汇编语言中如何使用寄存器进行数据交换和比较
优化点:分析代码中可以优化的地方,提高程序执行效率
Part Four
程序运行及测试
程序编译链接
编译过程:将源代码转换成机器语言
指令格式:汇编语言指令由操作码和操作数组成,操作码指明指令的操作类型,操作数指明操作数或操作数的地址。
伪指令:伪指令不是真正的计算机指令,而是用于告诉汇编程序如何组织程序的一种指示。常见的伪指令包括ORG、END、DB、DW等。
Part Three
汇编语言实现冒泡排序
排序数据准备
确定排序数据类型:根据具体需求选择合适的数据类型,如整数、字符等。
优化效果:通过减少数据交换次数,可以提高冒泡排序算法的执行效率,减少程序运行时间

汇编语言实现整数冒泡排序

汇编语言实现整数冒泡排序

第三次实验报告1.实现正整数的冒泡排序,要求有输入与输出。

实验源程序;LT413.ASM.model small.stack.datacount = 10array dw count dup(0)wtemp dw ?flg db 0.code.startupmovcx,countmovbx,offset arrayagaini: call readmov [bx],axincbxincbxcalldpcrlfiloopagaini;;movcx,countdec cxoutlp:mov flg,0movdx,cxmovbx,offset arrayinlp: mov ax,[bx]cmp ax,[bx+2]jna nextxchg ax,[bx+2]mov flg,1mov [bx],axnext: incbxincbxjnzinlpcmp flg,0jzfxwloopoutlp;;fxw:movcx,countmovbx,offset array againo: mov ax,[bx]movwtemp,axcall writeincbxincbxcalldpcrlfoloopagaino.exit 0read procpushbxpush cxpush dxxorbx,bxxorcx,cxmov ah,1int 21hcmp al,'+'jz read1cmp al,'-'jnz read2mov cx,-1read1: mov ah,1int 21hread2: cmp al,'0'jb read3cmp al,'9'ja read3sub al,30hshl bx,1movdx,bxshl bx,1addbx,dx;mov ah,0addbx,axjmp read1read3: cmp cx,0jz read4negbxread4: movax,bxpop dxpop cxpopbxretread endp dpcrlfi procpush axpush dxmov ah,2mov dl,0dhint 21hmov ah,2mov dl,0ahint 21hpop dxpop axretdpcrlfi endpwrite procpush axpushbxpush dxmovax,wtemptestax,axjnz write1mov dl,'0'mov ah,2int 21hjmp write5 write1: jns write2 movbx,axmov dl,'-'mov ah,2int 21hmovax,bxneg axwrite2: mov bx,10pushbxwrite3: cmp ax,0jz write4subdx,dxdivbxadd dl,30hpush dxjmp write3write4: pop dxcmp dl,10je write5mov ah,2int 21hjmp write4write5: pop dxpopbxpop axretwrite endpdpcrlfo procpush axpush dxmov ah,2mov dl,0dhint 21hmov ah,2mov dl,0ahint 21hpop dxpop axretdpcrlfo endpend实验结果:2.编制一个子程序把一个16位二进制数用十六进制的形式在屏幕上显示出来,分别运用如下三种参数传递方式,并用一个主程序验证它(1)采用AX寄存器传递这个16位的二进制数(2)采用wordTEMP变量传递这个16为二进制数(3)采用堆栈方法传递这个16位二进制数实验源程序:.model small.stack.datastring1db 'Mean1 use register :','$'string2db 'Mean2 use variable :','$'string3db 'Mean3 use stack :','$'string4db 0dh,0ah,'$'mydatadw 1992hwordTEMPdw ?.code.startup;AX方式movdx,offset string1;mov ah,9;int 21h;movax,wordptrmydata;call chan1;;变量方式push axmovdx,offset string4;mov ah,09h;int 21h;movdx,offset string2;mov ah,09h;int 21h;pop axmov word ptrwordTEMP,ax;call chan2;;栈方式push axmovdx,offset string4;mov ah,09h;int 21h;movdx,offset string3;mov ah,09h;int 21h;pop axpush ax;call chan3;pop ax;.exit 0chan1 procpush ax;pushbx;movbl,al;moval,ah;callALdisp;moval,bl;callALdisp;popbx;pop ax;retchan1 endpchan2 proc;wordTEMP传递push ax;pushbx;movbl,al;moval,ah;callALdisp;moval,bl;callALdisp;pop ax;retchan2 endpchan3 proc;栈传递pushbp;movbp,sp;push ax;pushbx;mov ax,[bp+4];movbl,al;moval,ah;callALdisp;moval,bl;callALdisp;popbx;pop ax;popbp;retchan3 endpALdisp procpush axpush cxpush dxpush axmovdl,almov cl,4shrdl,clor dl,30hcmp dl,39hjbe aldisp1add dl,7aldisp1: mov ah,2 int 21hpop dxand dl,0fhor dl,30hcmp dl,39hjbe aldisp2add dl,7aldisp2: mov ah,2 int 21hpop cxpop axretALdisp endpend实验结果:。

汇编语言实现冒泡排序(一).

汇编语言实现冒泡排序(一).

; 用汇编语言实现实现冒泡排序,并将排序后的数输出DATAS SEGMENTA dw 100,344,3435,43433,3438,343,134,80,8,1000,65535,54,45 N =$-A ; 计算数字所占的字节数DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART :MOV AX,DATASMOV DS,AXMOV SI,0 ;SI 遍历数字 ; 前一个数的地址MOV CX,N/2-1 ; 设置循环次数, M(M=N/2个数需要,循环 M-1次 CALL BUBBLE ; 调用 BUBBLE 将原来的数排序; 输出排序后的数MOV CX,N/2 ; 循环 M 次输出排序后的 M 个数MOV SI,0 ;SI 遍历排序后的数MOV DI,0 ; 用 DI 记录数字的位数MOV BP,N+5 ;BP 用于遍历存储的转化后的字符的位置SHOW: PUSH CX ; 循环次数入栈MOV DX,0 ; 由于将要进行 16位除需要置高 16位为 0MOV AX,[SI] ; 低 16位为排序后的数CALL DTOC ; 调用 DTOC 将十进制数转换为字符串CALL SHOW_STR ; 调用 SHOW_STR将一个数转化得到的字符串输出 ADD SI,2 ; 下一个数POP CX ; 循环次数出栈栈LOOP SHOWMOV AH,4CHINT 21H; 冒泡排序BUBBLE PROCL1: PUSH CX ; 将循环次数入栈LEA SI,A ;SI 遍历 DATAS 数据段的数字L2: MOV AX,A[SI] ; 将前一个数存于 AXCMP AX,A[SI+2] ; 比较前后两个数JBE NEXT ; 如果前一个数小于或等于后一个数则继续本轮的比较 XCHG AX,A[SI+2] ; 否则,交换前后两个数的位置MOV A[SI],AXNEXT:ADD SI,2 ; 下一个数LOOP L2 ; 注意内层循环的次数已经确定了POP CX ; 将循环次数出栈LOOP L1 ; 下一轮比较RETBUBBLE ENDP; 将十进制数转换为字符串并储存起来DTOC PROCS:MOV CX,10 ; 将除数 10,放入 CX 中CALL DIVDW ; 调用 DIVDW 程序ADD CL,30H ; 把数字转换为 ASCII 码,这样就能显示了MOV DS:[BP],CL ; 把 ASCII 码放到内存中INC DI ; 用 DI 记录循环的次数PUSH AX ; 将低 16位入栈ADD AX,DX ; 将高位与低位相加,接着判断是否已经除尽JZ BACK ; 除尽后返回调用处POP AX ; 将低 16位出栈DEC BP ; 逆序存放转化后的字符,便于主程序调用 SHOW_STR JMP S BACK:POP AX ; 为了得到正确的 IP 值,需要出栈一次RETDTOC ENDP; 子程序定义开始 , 功能是分离被除数的各个位的数字; 公式:X/N=int(H/N*65536+[rem(H/N*65536+L]/NDIVDW PROCPUSH AX ; 低 16位入栈MOV AX,DX ; 将高 16位写入 AX,MOV DX,0 ; 将高 16位置零DIV CX ; 将新的数除 10,MOV BX,AX ; 将商 int(H/N转移到 BX ,默认余数 rem(H/N在 DX POP AX ; 将低 16位出栈,DIV CX ; 将 [rem(H/N*65536+L]除 10, 默认余数在 DXMOV CX,DX ; 将余数转移到 CXMOV DX,BX ; 将商 int(H/N转移到 dx, 相当于 int(H/N*65536RET ; 子程序定义结束DIVDW ENDP; 实现字符串的输出SHOW_STR PROCS2:MOV AH,2 ; 输出数字转化后的字符串MOV DL,DS:[BP]INT 21HINC BP ; 顺序输出DEC DI ; 数字的位数减一JZ OK ; 字符串输出完了就结束JMP S2 ; 否则继续输出OK:MOV AH,2 ; 输出空格MOV DL,0INT 21HRETSHOW_STR ENDPCODES ENDSEND START; 实现冒泡排序,并将排序后的数输出DATAS SEGMENTA dw 100,344,3435,43433,3438,343,134,80,8,1000,65535,54,45 N=$-A ; 计算数字所占的字节数DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART :MOV AX,DATASMOV DS,AXMOV SI,0 ;SI 遍历数字 ; 前一个数的地址MOV CX,N/2-1 ; 设置循环次数, M(M=N/2个数需要,循环 M-1次 CALL BUBBLE ; 调用 BUBBLE 将原来的数排序; 输出排序后的数MOV CX,N/2 ; 循环 M 次输出排序后的 M 个数MOV SI,0 ;SI 遍历排序后的数MOV DI,0 ; 用 DI 记录数字的位数MOV BP,N+5 ; 用于遍历存储的转化后的字符的位置SHOW: PUSH CX ; 循环次数入栈MOV DX,0 ; 由于将要进行 16位除需要置高 16位为 0MOV AX,[SI] ; 低 16位为排序后的数CALL DTOC ; 调用 DTOC 将十进制数转换为字符串CALL SHOW_STR ; 调用 SHOW_STR将一个数转化得到的字符串输出 ADD SI,2 ; 下一个数POP CX ; 循环次数出栈栈LOOP SHOWMOV AH,4CHINT 21HBUBBLE PROCL1: PUSH CX ; 将循环次数入栈LEA SI,A ;SI 遍历 DATAS 数据段的数字L2: MOV AX,A[SI] ; 将前一个数存于 AXCMP AX,A[SI+2] ; 比较前后两个数JBE NEXT ; 如果前一个数小于或等于后一个数则继续本轮的比较XCHG AX,A[SI+2] ; 否则,交换前后两个数的位置MOV A[SI],AXNEXT:ADD SI,2 ; 下一个数LOOP L2 ; 注意内层循环的次数已经确定了POP CX ; 将循环次数出栈LOOP L1 ; 下一轮比较RETBUBBLE ENDP; 将十进制数转换为字符串并储存起来DTOC PROCS:MOV CX,10 ; 将除数 10,放入 CX 中CALL DIVDW ; 调用 DIVDW 程序ADD CL,30H ; 把数字转换为 ASCII 码,这样就能显示了MOV DS:[BP],CL ; 把 ASCII 码放到内存中INC DI ; 用 DI 记录循环的次数PUSH AX ; 将低 16位入栈ADD AX,DX ; 将高位与低位相加,接着判断是否已经除尽 JZ BACK ; 除尽后返回调用处POP AX ; 将低 16位出栈DEC BP ; 逆序存放转化后的字符,便于主程序调用 SHOW_STR JMP SBACK:POP AX ; 为了得到正确的 IP 值,需要出栈一次RETDTOC ENDP; 子程序定义开始 , 功能是分离被除数的各个位的数字; 公式:X/N=int(H/N*65536+[rem(H/N*65536+L]/NDIVDW PROCPUSH AX ; 低 16位入栈MOV AX,DX ; 将高 16位写入 AX,MOV DX,0 ; 将高 16位置零DIV CX ; 将新的数除 10,MOV BX,AX ; 将商 int(H/N转移到 BX ,默认余数 rem(H/N在 DX POP AX ; 将低 16位出栈,DIV CX ; 将 [rem(H/N*65536+L]除 10, 默认余数在 DX MOV CX,DX ; 将余数转移到 CXMOV DX,BX ; 将商 int(H/N转移到 dx, 相当于 int(H/N*65536 RET ; 子程序定义结束DIVDW ENDP; 实现字符串的输出SHOW_STR PROCS2:MOV AH,2 ; 输出数字转化后的字符串MOV DL,DS:[BP]INT 21HINC BP ; 顺序输出DEC DI ; 数字的位数减一JZ OK ; 字符串输出完了就结束 JMP S2 ; 否则继续输出 OK:MOV AH,2 ; 输出空格MOV DL,0INT 21HRETSHOW_STR ENDPCODES ENDSEND START。

汇编语言实现整数冒泡排序

汇编语言实现整数冒泡排序

实验报告专业班级:信安1101姓名:雷友波学号:09091107031.实现正整数的冒泡排序,要求有输入与输出。

一、实验目的(1)学习汇编语言循环结构语句的特点,重点掌握冒泡排序的方法。

(2)理解并掌握各种指令的功能,编写完整的汇编源程序。

(3)进一步熟悉DEBUG的调试命令,运用DEBUG进行调试汇编语言程序。

实验源程序;LT413.ASM.model small.stack.datacount = 10array dw count dup(0)wtemp dw ?flg db 0.code.startupmov cx,countmov bx,offset arrayagaini: call readmov [bx],axinc bxinc bxcall dpcrlfiloop againi;;mov cx,countdec cxoutlp:mov flg,0mov dx,cxmov bx,offset array inlp: mov ax,[bx]cmp ax,[bx+2]jna nextxchg ax,[bx+2]mov flg,1mov [bx],axnext: inc bxinc bxjnz inlpcmp flg,0jz fxwloop outlp;;fxw:mov cx,countmov bx,offset array againo: mov ax,[bx]mov wtemp,axcall writeinc bxinc bxcall dpcrlfoloop againo.exit 0read procpush bxpush cxxor bx,bxxor cx,cxmov ah,1int 21hcmp al,'+'jz read1cmp al,'-'jnz read2mov cx,-1read1: mov ah,1int 21hread2: cmp al,'0' jb read3cmp al,'9'ja read3sub al,30hshl bx,1mov dx,bxshl bx,1shl bx,1add bx,dx;mov ah,0add bx,axjmp read1 read3: cmp cx,0jz read4neg bxread4: mov ax,bx pop dxpop cxpop bxretread endp dpcrlfi procpush axpush dxmov ah,2mov dl,0dhint 21hmov ah,2mov dl,0ahint 21hpop dxpop axretdpcrlfi endpwrite procpush axpush bxpush dxmov ax,wtemptest ax,axjnz write1mov dl,'0'mov ah,2int 21hjmp write5 write1: jns write2 mov bx,axmov dl,'-'mov ah,2int 21hmov ax,bxneg axwrite2: mov bx,10push bxwrite3: cmp ax,0jz write4sub dx,dxdiv bxadd dl,30hpush dxjmp write3write4: pop dxcmp dl,10je write5mov ah,2int 21hjmp write4 write5: pop dxpop bxpop axretwrite endp dpcrlfo procpush axpush dxmov ah,2mov dl,0dhint 21hmov ah,2mov dl,0ahint 21hpop dxpop axretdpcrlfo endpend实验结果:2.编制一个子程序把一个16位二进制数用十六进制的形式在屏幕上显示出来,分别运用如下三种参数传递方式,并用一个主程序验证它(1)采用AX寄存器传递这个16位的二进制数(2)采用wordTEMP变量传递这个16为二进制数(3)采用堆栈方法传递这个16位二进制数实验源程序:.model small.stack.datastring1 db 'Mean1 use register :','$'string2 db 'Mean2 use variable :','$'string3 db 'Mean3 use stack :','$'string4 db 0dh,0ah,'$'mydata dw 1992hwordTEMP dw ?.code.startup;AX方式mov dx,offset string1;mov ah,9;int 21h;mov ax,word ptr mydata;call chan1;;变量方式push axmov dx,offset string4;mov ah,09h;int 21h;mov dx,offset string2;mov ah,09h;int 21h;pop axmov word ptr wordTEMP,ax;call chan2;;栈方式push axmov dx,offset string4;mov ah,09h;int 21h;mov dx,offset string3;mov ah,09h;int 21h;pop axpush ax;call chan3;pop ax;.exit 0chan1 procpush ax;push bx;mov bl,al;mov al,ah;call ALdisp;mov al,bl;call ALdisp;pop bx;pop ax;retchan1 endpchan2 proc;wordTEMP传递push ax;push bx;mov bl,al;mov al,ah;call ALdisp;mov al,bl;call ALdisp;pop bx;pop ax;retchan2 endpchan3 proc;栈传递push bp;mov bp,sp;push ax;push bx;mov ax,[bp+4];mov bl,al;mov al,ah;call ALdisp;mov al,bl;call ALdisp;pop bx;pop ax;pop bp;retchan3 endpALdisp procpush axpush cxpush dxpush axmov dl,almov cl,4shr dl,clor dl,30hcmp dl,39hjbe aldisp1add dl,7aldisp1: mov ah,2 int 21hpop dxand dl,0fhor dl,30hcmp dl,39hjbe aldisp2add dl,7aldisp2: mov ah,2int 21hpop dxpop cxpop axretALdisp endpend实验结果:心得体会:在本次汇编语言程序设计实验中,我们学习了汇编语言的循环结构,并对冒泡排序法进行了汇编程序设计,我首先编写了对给定数据进行冒泡排序的算法设计,这有助于我熟悉冒泡排序的逻辑结构,理清设计思路。

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语言和汇编都可以。

arm汇编之冒泡排序

arm汇编之冒泡排序

arm汇编之冒泡排序开始在ADS里面写程序后,发现自己之前对于X86汇编的学习完全归还给了我的老师门。

最直接的便是要写一个从小到大的冒泡排序。

冒泡排序的思想我想就不用赘述了。

以前c语言遍的应该很多了。

算法不成问题,可是数据结构知道是数组,可是数组在arm汇编里面该在怎么定义了?其实,还真感觉又要从零开始了。

X86的汇编已经完全归还给了我敬爱的微机原理老师。

网上看到了一个广为流传的冒泡排序,既然写不出来,那就先学习它的精髓,说不定还能为我所用了。

代码详细的看了看。

具体翻译如下:AREA Sort,CODE,READONLY :首先用AREA伪代码加上CODE,表明下面引出的将是一个代码段,ENTRY 和END成对出现,说明他们之间的代码是程序的主体ENTRY:表示代码的开始Start MOV r4,#0 :将0赋值给r4LDR r6,=src :在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同样的,当src变量代表一个数组时,需要r0寄存器指向src 则需要这样赋值:LDR r0,=src 当格式是LDR r0,[r2],则第二个参数表示寄存器,我的理解是符号表示取内容,r2本身表示一个寄存器地址,取内容候将其存取r0这个寄存器中跳转到LDR R0,[R1]将存储器地址为R1的字数据读入寄存器R0 LDRR0,[R1,#8]将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1,此句是将数据src的首地址赋值给R6ADD r6,r6,#len:R6为数组的最后一个数组元素的地址。

数组这时是连续分配的。

Outer LDR r1,=src:将src地址即数组元素首地址赋值给R1Inner LDR r2,[r1] :将存储器地址为r1的字数据读入r2 LDR r3,[r1,#4]:将存储器地址为R1+4的字数据读入R3 CMP r2,r3 :比较R2,R3STRGT r3,[r1]:若大于,则将R3中的字数据写入以R1为地址的存储器中STRGT r2,[r1,#4]:若大于,则将R2中的字数据写入以R1+4为地址的存储器中ADD r1,r1,#4:R1+4赋值给R1 CMP r1,r6:R1与R6比较BLT Inner:若是有符号数小于,即R1<R6,则跳转到Inner行执行ADD r4,r4,#4:R4+4赋值给R4 CMP r4,#len:R4与len比较SUBLE r6,r6,#4 :若有符号数小于或等于,则R6-4赋值给R6 BLE Outer :若有符号数小于或等于,则跳转到OuterStop MOV r0,#0x18 , stop一段是用来是程序退出的,第一个语句“MOV r0,#0x18”将r0赋值为0x18,这个立即数对应于宏angel_SWIreason_ReportException。

【免费下载】冒泡法汇编

【免费下载】冒泡法汇编

学号:1001500253 学号:1001500127
班级:10007100 班级:10007100
姓名:张锦明 姓名:李仲
5、总体来说通过这次试验,对汇编有了一定的认识,然而对于汇编程序内部的运行还
是比较模糊,只有个大概的印象。
附录:
开始
Cont DX
DX 1 DX DX CX
0 SI
stack ends
code segment para 'code'
assume cs:code,ds:data,ss:stack
sign proc far
push ds
xor ax,ax
push ax
mov ax,data mov ds,ax
mov dx,cont
chengxu0: dec dx mov cx,dx
学号:1001500253 学号:1001500127
;定义数组,并赋初值
;计算数组元素个数
;标准程序前奏
;为 dx 赋值
;cx 控制每轮循环次数
;si 为数组第一个数下标
;进行数组首个元素传递
;比较相邻两个元素大小
;交换相邻元素
;进行每轮小循环
;控制大循环 19 次
班级:10007100 班级:10007100
学号:1001500253 学号:1001500127
Y
结束
班级:10007100 班级:10007100
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内 纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
  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。

相关文档
最新文档