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

合集下载

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

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

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

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

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

;程序代码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. 题⽬:将⼀个数组的所有元素排序后输出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。

汇编语言-冒泡排序(绝对给力)

汇编语言-冒泡排序(绝对给力)

DATAS SEGMENTBUF DW 20 DUP(0);此处输入数据段代码N DB 010dMES2 DB'Please input ten numbers(number less than 100):','$' MES3 DB'The digital after sorted:','$'a dw 0DATAS ENDSSTACKS SEGMENTSTACK DW 200 DUP(0);此处输入堆栈段代码STACKS ENDSCODES SEGMENT;此处为代码段ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXmov ax,stacksmov ss,axmov sp,200lea dx,mes2;显示输入请用户输入数组mov ah,09int 21hcall crlxor ax,axmov ax,010dmov n,alxor cx,cxmov cl,almov bx,0input1:call decibinpush dxcall crlpop dxmov buf[bx],dxadd bx,02hloop input1;*********************冒泡排序xor cx,cxmov cl,ndec clLOOP1:mov dx,cxmov bx,0LOOP2:mov ax,buf[bx]cmp ax,buf[bx+2]jge loop3xchg ax,buf[bx+2]mov buf[bx],axLOOP3:add bx,2dec cxjne loop2mov cx,dxloop loop1lea dx,mes3mov ah,9int 21hcall crlmov cl,nmov si,0OUTPUT1:mov ax,buf[si]call bindexmov dl,2chmov ah,02hint 21hadd si,02hdec cljnz output1mov ah,4chint 21hBINDEX PROC NEAR;2->10输出push aPX:mov bx,10dxor dx,dxdiv bxadd dx,30hpush dxcmp ax,0jnz pxSHOW:pop dxcmp dx,ajz exitmov ah,02hint 21hjmp showexit:retBINDEX ENDPDECIBIN PROC NEAR;进制之间的转换mov dx,0push cxnewchar:mov ah,01hint 21hsub al,30hjl exit1cmp al,9djg exit1cbwxchg ax,dxmov cl,10dmul clxchg ax,dxadd dx,axjmp newcharexit1:pop cxretDECIBIN ENDPCRL PROC NEAR;*********换行回车函数mov dl,0dhmov ah,02hint 21hmov dl,0ahmov ah,02hint 21hretCRL endpCODES ENDSEND START。

汇编:汇编语言实现冒泡排序(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.实现正整数的冒泡排序,要求有输入与输出。

实验源程序;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实验结果:。

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

汇编语言冒泡法排序

汇编语言冒泡法排序

汇编语言冒泡法排序汇编语言中的冒泡排序算法如下:```assemblysection .dataarray db 5, 1, 4, 2, 8 ; 待排序的数组size equ $-array ; 数组的大小section .textglobal _start_start:mov ecx, size ; 初始化循环计数器为数组大小outer_loop:xor eax, eax ; 清零标志寄存器,用于判断是否有交换发生mov edi, 1 ; 初始化内层循环计数器为1inner_loop:movsx ebx, byte [array + edi - 1] ; 将当前元素加载到寄存器ebxcmp bl, byte [array + edi] ; 比较当前元素和下一个元素jg swap ; 如果当前元素大于下一个元素,则交换它们inc edi ; 内层循环计数器加1 loop inner_loop ; 继续内层循环cmp eax, 0 ; 判断标志寄存器是否为0jne outer_loop ; 如果有交换发生,则继续外层循环exit:mov eax, 1 ; 系统调用号1代表退出程序xor ebx, ebx ; 退出状态码为0int 0x80 ; 调用系统调用swap:mov dl, byte [array + edi] ; 将下一个元素加载到寄存器dlmov byte [array + edi], bl ; 将当前元素赋值给下一个元素mov byte [array + edi - 1], dl ; 将下一个元素赋值给当前元素mov eax, 1 ; 设置标志寄存器为非零,表示有交换发生jmp inner_loop ; 继续内层循环```这段汇编代码使用了两层循环,外层循环控制整个排序过程,内层循环用于比较相邻的两个元素并交换它们。

内层循环每次都会比较当前元素和下一个元素,如果当前元素大于下一个元素,则交换它们。

汇编语言冒泡排序

汇编语言冒泡排序

DATAS SEGMENTKEYBUFFER DB 100DB ?DB 100 DUP(?)A DB 100 DUP(?)X DB ?TEMP DB ?STRING1 DB 'PLEASE INPUT 10 NUMBERS : ',0DH,0AH, '$' DATAS ENDSSTACKS SEGMENT STACK 'STACK'DW 100H DUP(?)TOP LABEL WORDSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:DATAS START:MOV AX,DATASMOV DS,AXMOV ES,AXMOV AX,STACKSMOV SS,AXLEA SP,TOPLEA DX,STRING1MOV AH,09HINT 21HLEA DX,KEYBUFFERMOV AH,0AHINT 21HMOV CX,0AHMOV DI,0LEA SI ,KEYBUFFER+2JMP LOOP1NEXT1:INC SILOOP1:MOV TEMP,10;MOV X,0MOV DL,[SI]CMP DL,20HJE NEXT1SUB DL,'0'MOV AL,DL ;十位放到ALMOV DL,[SI+1] ;个位放到DLCMP DL,20HJE NEXTCMP DL,0DHJE NEXT;MOV X,AL ;个位放入X;MUL TEMP ;个位乘1 ;MOV X,AX;MOV AL,10 ;;TEMP*10;MUL TEMP;MOV TEMP,AL ;;MUL TEMP;MOV AL,DL;MUL TEMPADD AL,DLNEXT:MOV A[DI],ALINC DIINC SI;MOV DL,X;INC SI;POP CXLOOP LOOP1MOV CX,10LOP1:MOV SI,0MOV AL,A[SI]MOV BL,10HDIV BLMOV DL,30HADD AL,DLMOV AH,02HINT 21HADD AH,DLMOV X,AHMOV AH,02HINT 21HINC SILOOP LOP1;MOV CX ,9;MOV SI,0;LOOP4:;PUSH CX;LOOP3:;MOV AL,A[SI];CMP AL,A[SI+1];JB CONTINUE;MOV BL,A[SI+1];XCHG AL,A[SI+1];MOV A[SI],BL;CONTINUE:;INC SI;LOOP LOOP3;POP CX;;MOV SI,0;LOOP LOOP4;;LEA DX,AMOV AH,9INT 21HMOV AH,4CHINT 21H CODES ENDSEND START。

汇编语言汇编语言实现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`寄存器中。

8086汇编程序,实现对输入字符进行冒泡排序后输出

8086汇编程序,实现对输入字符进行冒泡排序后输出

STACK1 SEGMENT STACKDW 256 DUP(?)STACK1 ENDSDATA SEGMENT USE16MES1 DB 'Welcome!',0AH,0DH,0AH,0DH,'Please input several alphabets:',0AH,0DH,'Press ENTER to finish!',0AH,0DH,0AH,0DH,'$'MES2 DB 'Number of total input letters(Decimal):','$'MES3 DB 'Number of big letters(Decimal):','$'MES4 DB 'Number of small letters(Decimal):','$'ALPHA DB 100 DUP(0)SUM DW 3 DUP(0)DATA ENDSCRLF MACROMOV DL,0AHMOV AH,02HINT 21HMOV DL,0DHMOV AH,02HINT 21HENDMOUTCHAR MACRO XMOV DL,XMOV AH,02HINT 21HENDMOUTSTR MACRO XLEA DX,X ;提示显示开始MOV AH,09HINT 21H ;提示显示结束ENDMSHOWNUM MACRO XMOV AX,XMOV CL,0AHDIV CLMOV CL,ALMOV CH,AHADD CH,30HADD CL,30HOUTCHAR CLOUTCHAR CHCRLFENDMSHOWRLT MACRO X,Y,Z,KCMP X,0HJE KMOV CX,XMOV BX,YZ: OUTCHAR ALPHA[BX]INC BXLOOP ZK: CRLFCRLFENDMCODE SEGMENT USE16ASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXOUTSTR MES1 ;输出提示语MOV BX,0HAGAIN: MOV AH,07H ;键盘输入开始INT 21HCMP AL,0DH ;ENTER键JE OVERCMP AL,41H ;是否小于AJB AGAINCMP AL,7AH ;是否大于zJA AGAINCMP AL,5AH ;是否大于ZJA C1ADD SUM[02H],01HMOV ALPHA[BX],ALINC BXJMP C2C1: CMP AL,61H ;是否小于aJB AGAINADD SUM[04H],01HMOV ALPHA[BX],ALINC BXC2: OUTCHAR ALJMP AGAINOVER: CRLF ;输入结束CMP BX,0H ;输入0个字母JE EXITMOV SUM[00H],BXMOV BX,0HMOV AX,0HLEA DI,ALPHASORT: INC AXCMP AX,SUM[00H]JE EXITMOV DL,[DI]MOV BX,AXNEXT: CMP DL,ALPHA[BX]JB NOXCHG DL,ALPHA[BX]NO: INC BXCMP BX,SUM[00H]JE RANKJMP NEXTRANK: MOV [DI],DLINC DIJMP SORTJMP EXIT;TOKEY:JMP KEYEXIT: CRLFOUTSTR MES2 ;输出提示语SHOWNUM SUM[00H]CRLFOUTSTR MES3 ;输出提示语SHOWNUM SUM[02H]SHOWRLT SUM[02H],0H,BIG,OBIGOUTSTR MES4 ;输出提示语SHOWNUM SUM[04H]SHOWRLT SUM[04H],SUM[02H],SML,OSMLKEY: MOV AH,1 ;程序功能结束INT 16HJZ KEYMOV AX,4C00HINT 21HCODE ENDSEND START。

微机原理-实验一-汇编语言-冒泡排序

微机原理-实验一-汇编语言-冒泡排序

微机原理实验报告班级: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在存储器地址末尾没变。

汇编实现冒泡排序的方法示例

汇编实现冒泡排序的方法示例

汇编实现冒泡排序的⽅法⽰例冒泡排序算法的运作如下:(从后往前)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以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

汇编实现冒泡排序并输出结果

汇编实现冒泡排序并输出结果

结果截图这样子的程序:;;无符号16位整数冒泡排序data segmenta dw 12,4,9,0,65358,6,1,3,5,79cnt dw 10data endsstack segmentstack endscode segmentassume cs:code,ds:data,ss:stacksort proc near ;冒泡排序,具有两个参数,数组偏移和个数push bppush axpush cxpush sipush dimov bp,spmov cx,ss:[bp+0CH] ;取出函数形参,放在(si,cx)mov si,ss:[bp+0EH]loop1:push cx ;外层循环还有cx-1 次,将次数压栈;同时cx-1 也是内层循环次数,不再赋值mov di,si ;di为内层循环遍历指针loop2:mov ax,ds:[di]cmp ax,ds:[di+2]jna noswapmov dx,ds:[di+2]mov ds:[di+2],axmov ds:[di],dxnoswap:inc diinc didec cxcmp cx,1ja loop2pop cx ;外层循环次数出栈dec cxcmp cx,1ja loop1pop dipop sipop cxpop axpop bpret 4sort endpdisplay proc near ;将0-15转换为0-9&&A-Fpush axmov ah,02Hcmp dl,0AHjae addAjb add0addA:add dl,37Hint 21Hjmp ffadd0:add dl,30Hint 21Hjmp ffff:pop axretdisplay endpshow proc near ;打印数组,具有两个参数,数组偏移和个数push bppush axpush bxpush cxpush sipush dxmov bp,spmov cx,ss:[bp+0EH] ;取出函数形参,放在(si,cx)mov si,ss:[bp+10H]lop1: ;将一个0-65535 的数据以十进制的形式打印push cxmov cx,0mov dx,0mov ax,ds:[si]lop2:mov bx,0AHdiv bxpush dx ;数字顺序是个,十,百,千所以先存起来inc cxmov dx,0cmp ax,0ja lop2lop21: ;和lop2并列的内循环,用于将颠倒顺序的十进制反转打印pop dxcall displaydec cxcmp cx,0ja lop21mov ah,02Hmov dl,20Hint 21Hpop cxinc siinc sidec cxcmp cx,0ja lop1pop dxpop sipop cxpop bxpop axpop bpret 4show endpstart: ;主程序调用子程序进行排序及打印mov ax,stackmov ss,axmov ax,datamov ds,axlea ax,a ;参数两个(a,cnt)push axmov ax,cntpush axcall sortlea ax,a ;参数两个(a,cnt)push axmov ax,cntpush axcall showmov ah,4CHint 21Hcode endsend start。

计算机组成原理实验-基于x86汇编指令实现冒泡排序

计算机组成原理实验-基于x86汇编指令实现冒泡排序

PB12011047施连杰本程序设计中,假设最终将给出的待排序列NUM[1…n]按从小到大有序排列。

此时冒泡排序的原理为,每趟比较从第一个元素开始,将相邻两元素NUM[i]与NUM[i+1]比较,若NUM[i]大于NUM[i+1],则交换两元素,于是每趟比较总能将本次序列中最大的元素NUM[i m]交换到末尾。

再进行下一轮比较,由于最大元素已经沉底,不必再参与比较,因此序列的末尾前移一项,此时又可将剩余元素中的最大元素沉底。

不断重复单趟排序,直到序列的头尾相重合,则冒泡结束,得到了有序序列。

根据冒泡排序的原理,可以得到程序的基本设计思路,即采用两重循环来实现。

第一重循环控制每趟排序,第二重循环则控制单趟排序中的每次比较。

用DI存放控制第一重循环的计数值,初始化为COUNT-1,COUNT是数组中的元素个数;每一轮循环结束,递减DI值并利用JNZ条件跳转语句判断循环是否继续。

BX用于存放数组元素序号,每一轮第一重循环开始时BX初始化为0;由于数据采用DW格式,故[BX]每次递增的值应为2。

第二重循环中,每次比较时将NUM[BX]的值移入寄存器AX中,并与NUM[BX+2]的值进行比较,利用JLE条件跳转指令,若NUM[BX]>NUM[BX+2],则交换两者的值。

此外,寄存器DX用以存放每趟排序的终点,初始化为2*(COUNT-1);每趟排序完成后,由于最大元素已经沉底,不必再参与下一趟排序,因此将DX的值递减2。

每一次比较结束之后,更新BX的值,并比较[BX]+2与[DX]的值,以判断此趟排序是否到终点。

关于X86的汇编指令和硬件规定,直接参考相关资料。

汇编程序如下DATA SEGMENTNUM DW 11,4,2,15,7,9,13,5,12,6,8,1 ;待排序数据COUNT EQU ($-NUM)/2 ;数据个数DATA ENDSMAIN SEGMENTASSUME C S:MAIN,DS:DATABEGIN: MOV AX,DATAMOV DS,AXMOV DI,COUNT-1 ;判断LOOP1是否进行MOV DX,COUNT-1ADD DX,DX ;表示每趟冒泡的终点LOOP1: MOV CX,DI ;LOOP1循环计数MOV BX,0 ;数据数组元素序号JMP LOOP2SETBX: SUB BX,2 ;修改BX为正确的起始值LOOP2: MOV AX,NUM[BX]CMP AX,NUM[BX+2] ;比较NUM[BX],NUM[BX+2]JLE NEXT ;可用于有符号数XCHG AX,NUM[BX+2] ;若大于,则交换相邻两数MOV NUM[BX],AXNEXT: ADD BX,4 ;BX为下一次比较起点CMP BX,DX ;将BX+2与DX进行比较JLE SETBXSUB DX,2 ;最大数已经沉底,下一趟不比较DEC DIJNZ LOOP1 ;判断循环是否继续MOV AX,4C00HINT 21HMAIN ENDSEND B EGIN使用DOSBox进行Debug,首先进行相关配置。

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

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

ADS下用汇编实现冒泡排序

ADS下用汇编实现冒泡排序

实验四ADS下汇编程序设计实验实验目的:1:掌握冒泡排序算法2:多重循环程序设计联系3:加深堆栈保护的用途实验环境:1、硬件:PC机。

2、软件ADS1.2。

实验内容:1、在ADS中新建工程,并设置开发环境。

2、在Code Warrior 环境中编辑、编译和链接汇编语言程序,并生成可执行文件。

3、在AXD中调试汇编程序;4、使用命令行界面编辑、编译和链接汇编程序。

实验过程:1:编译源程序并通过2:通过单步执行查看相应寄存器中的数据3:在程序的指令旁边加上相应的注释,并指明当前寄存器中的数据冒泡排序原理例:数组个数n=45, 3, 4, 1,第一遍排序3, 5, 4, 13, 5, 4, 11, 5, 4, 3经过第一遍排序,将一个最小数排到第一个位置,后面则不必对它进行比较第二遍排序1, 4, 5, 31, 3, 5, 4经过第二遍排序,将一个次小数排到第二个位置,后面则不必对它进行比较第三遍排序1,3, 4, 5经过第三遍排序,将第三小数排到第三个位置,后面则不必对它进行比较从以上可以看出,如果数组中数的个数为n,则大循环的次数为n-1从程序设计上,可以考虑,大循环的循环条件为计数循环,循环次数位n-1,内部循环的循环判定条件为比较的数据的地址,用条件循环来实现。

源程序:AREA BUF,DATA,READWRITEARRAY DCD 5,4,3,2,1,6 ;给的数LEN EQU 4*6 ;数组的长度定义为24AREA MAOPAO,CODE,READONLYENTRYCODE32START MOV R4,#5 ;将5给R4LDR R6,=ARRAY ;加载AREA中的数据ADD R6,R6,#LEN ;R6地址加24LDR R0,=ARRAY ;R0指向数据首址LDR R1,=ARRAY+4 ;R1指向数据第二个地址LDR SP,=0X40003F00 ;指针变为=0X40003F00LOOP1 LDR R2,[R0] ;将5给R2LDR R3,[R1] ;将4给R3STMFD SP!,{R1} ;现场保存,将R1寄存器内容入栈LOOP2 CMP R2,R3 ;R2与R3做比较STRHI R3,[R0] ;若大于,将寄存器中的5给R3STRHI R2,[R1] ;若大于,将4放入R2的内存中LDR R2,[R0] ;加载内存中数据,将内存中4给寄存器R2ADD R1,R1,#4 ;R1地址加4CMP R1,R6 ;R1与R6做比较LDRCC R3,[R1] ;若小于,将R1对应的内存地址里的数(3)给R3BCC LOOP2 ;若小于,跳转到LOOP2LDMFD SP!,{R1} ;恢复现场,将R1寄存器内容出栈ADD R0,R0,#4 ;R0地址加4ADD R1,R1,#4 ;R1地址加4SUBS R4,R4,#1 ;R4减1BNE LOOP1 ;R4不等于0就跳转到LOOP1HALT B HALTEND实验思考:1、换成从大到小排序,程序如何修改?2、定义一字符串,编程把其中的大写字母变小写字母。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

实验源程序
;LT413.ASM
.model small
.stack
.data
count = 10
array dw count dup(0)
wtemp dw ?
flg db 0
.code
.startup
mov cx,count
mov bx,offset array
againi: call read
mov [bx],ax
inc bx
inc bx
call dpcrlfi
loop againi
;
;
mov cx,count
dec cx
outlp:
mov flg,0
mov dx,cx
mov bx,offset array
inlp: mov ax,[bx]
cmp ax,[bx+2]
jna next
xchg ax,[bx+2]
mov flg,1
mov [bx],ax
next: inc bx
inc bx
jnz inlp
cmp flg,0
jz fxw
loop outlp
;
;
fxw:
mov cx,count
mov bx,offset array againo: mov ax,[bx]
mov wtemp,ax
call write
inc bx
inc bx
call dpcrlfo
loop againo
.exit 0
read proc
push bx
push cx
push dx
xor bx,bx
xor cx,cx
mov ah,1
int 21h
cmp al,'+'
jz read1
cmp al,'-'
jnz read2
mov cx,-1
read1: mov ah,1
int 21h
read2: cmp al,'0'
jb read3
cmp al,'9'
ja read3
sub al,30h
shl bx,1
mov dx,bx
shl bx,1
add bx,dx
;
mov ah,0
add bx,ax
jmp read1
read3: cmp cx,0
jz read4
neg bx
read4: mov ax,bx
pop dx
pop cx
pop bx
ret
read endp dpcrlfi proc
push ax
push dx
mov ah,2
mov dl,0dh
int 21h
mov ah,2
mov dl,0ah
int 21h
pop dx
pop ax
ret
dpcrlfi endp
write proc
push ax
push bx
push dx
mov ax,wtemp
test ax,ax
jnz write1
mov dl,'0'
mov ah,2
int 21h
jmp write5 write1: jns write2 mov bx,ax
mov dl,'-'
mov ah,2
int 21h
mov ax,bx
neg ax
write2: mov bx,10
push bx
write3: cmp ax,0
jz write4
sub dx,dx
div bx
add dl,30h
push dx
jmp write3
write4: pop dx
cmp dl,10
je write5
mov ah,2
int 21h
jmp write4
write5: pop dx
pop bx
pop ax
ret
write endp
dpcrlfo proc
push ax
push dx
mov ah,2
mov dl,0dh
int 21h
mov ah,2
mov dl,0ah
int 21h
pop dx
pop ax
ret
dpcrlfo endp
end
实验结果:
2.编制一个子程序把一个16位二进制数用十六进制的形式在屏幕上显示出来,分别运用
如下三种参数传递方式,并用一个主程序验证它
(1)采用AX寄存器传递这个16位的二进制数
(2)采用wordTEMP变量传递这个16为二进制数
(3)采用堆栈方法传递这个16位二进制数
实验源程序:
.model small
.stack
.data
string1 db 'Mean1 use register :','$'
string2 db 'Mean2 use variable :','$'
string3 db 'Mean3 use stack :','$'
string4 db 0dh,0ah,'$'
mydata dw 1992h
wordTEMP dw ?
.code
.startup
;AX方式
mov dx,offset string1;
mov ah,9;
int 21h;
mov ax,word ptr mydata;
call chan1;
;变量方式
push ax
mov dx,offset string4;
mov ah,09h;
int 21h;
mov dx,offset string2;
mov ah,09h;
int 21h;
pop ax
mov word ptr wordTEMP,ax;
call chan2;
;栈方式
push ax
mov dx,offset string4;
mov ah,09h;
int 21h;
mov dx,offset string3;
mov ah,09h;
int 21h;
pop ax
push ax;
call chan3;
pop ax;
.exit 0
chan1 proc
push ax;
push bx;
mov bl,al;
mov al,ah;
call ALdisp;
mov al,bl;
call ALdisp;
pop bx;
pop ax;
ret
chan1 endp
chan2 proc;wordTEMP传递
push ax;
push bx;
mov bl,al;
mov al,ah;
call ALdisp;
mov al,bl;
call ALdisp;
pop ax;
ret
chan2 endp
chan3 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;
ret
chan3 endp
ALdisp proc
push ax
push cx
push dx
push ax
mov dl,al
mov cl,4
shr dl,cl
or dl,30h
cmp dl,39h
jbe aldisp1
add dl,7
aldisp1: mov ah,2 int 21h
pop dx
and dl,0fh
or dl,30h
cmp dl,39h
jbe aldisp2
add dl,7
aldisp2: mov ah,2 int 21h
pop cx
pop ax
ret
ALdisp endp
end
实验结果:。

相关文档
最新文档