|
![]() | 作者: langzigzl [langzigzl]
![]() |
登录 |
用冒泡法对一组输入资料排序,并将排序后的结果显示出来。 哪位哥哥 姐姐 能帮忙修改一下 谢谢了 .MODEL SMALL .DATA DSI0 DB 'input the number of data!$' DSI1 DB 'INPUT ERROR!!$' DSI2 DB 'input the data!(1-255)!!$' DSI3 DB 'the data you wanted is:$' DSI4 DB 'Are you want to exit ? (y/n)$' DSI5 DB 'Are you want to exit ? (y/n)$' m_number DB 0H m_n db ? m_number2 db 0h m_d2 Dw 0 m_d1 db ? m_d3 Dw ? array db 256 dup(?) m_bit dw ? m_x DB ? m_y DB ? .stack 100H .CODE .STARTUP main: call input ;主程序 call maopao call xianshi call scanq input proc near MOV AL,3 ;清屏 MOV AH,0 INT 10H mov dx,offset dsi0 ;提示输入资料个数 mov ah,09h int 21h call scan mov ax,m_d2 mov m_number,al mov m_n,al mov m_number2,al mov al,3 mov ah,0 int 10h mov dx,offset dsi2 ;提示输入资料 mov ah,09h int 21h LEA SI,ARRAY ;将ARRAY的偏移量送入SI mov m_d2,0 mov m_bit,0 ll: call scan ;循环输入规定个数的资料 mov al,3 mov ah,0 int 10h mov ax,m_d2 MOV [SI],al mov dl,[si] inc si lp: sub m_number,1 cmp m_number,0 mov dx,offset dsi2 mov ah,09h int 21h mov m_bit,0 jnz ll ret input endp maopao proc near ;将输入的所有资料用冒泡法排序 sub m_number2,1 mov dl,0ffh mov bl,m_number2 gooni: cmp dl,0ffh jne ok xor dl,dl mov cl,m_number2 lea si,array goonj: mov al,[si] cmp al,[si+1] jbe next xchg al,[si+1] mov [si],al mov dl,0ffh next: add si,1 dec cl cmp cl,0 jnz goonj dec bl jnz gooni ok: ret maopao endp xianshi proc near ;显示排序后的所有资料 lea si,array mov al,3 mov ah,0 int 10h mov dx,offset dsi3 mov ah,09h int 21h MOV AH,6 MOV DL,' ' INT 21H MOV AH,3 MOV BH,0 INT 10H MOV m_x,DL MOV m_y,DH MOV AH,2 MOV BH,0 DEC m_x MOV DL,m_x MOV DH,m_y sub dl,17h add dh,01h INT 10H dp: mov ah,0 mov al,[si] call display inc si MOV AH,6 MOV DL,' ' INT 21H sub m_n,1 mov bl,m_n cmp m_n,0 jnz dp ret xianshi endp SCAN proc near ;输入字符并转换成数据保存 MOV AH,01H INT 21H .IF AL==0DH JMP SCAN1 .ENDIF .IF AL>2FH && AL<3AH ;将输入字符的ASCII码转换成数据 SUB AL,30H INC m_bit MOV m_d1,AL .ELSE CALL DISNULL ;若输入字符在0~9之外则调用DISNULL JMP SCAN .ENDIF MOV AH,00H .IF m_bit==1 MOV AL,m_d1 MOV m_d2,Ax .ENDIF .IF m_bit==2 MOV Ax,m_d2 MOV CX,0aH MUL CX MOV m_d2,Ax MOV AL,m_d1 ADD m_d2,Ax .ENDIF .IF m_bit==3 MOV Ax,m_d2 MOV m_d3,AX MOV CL,0aH MUL CL MOV m_d2,Ax MOV AL,m_d1 ADD m_d2,Ax .ENDIF .IF m_d2>0FFH CALL DISNULL MOV AX,m_d3 MOV m_d2,Ax .ENDIF JMP SCAN SCAN1: .IF m_bit==0 MOV DX,OFFSET DSI1 MOV AH,9H INT 21H .ENDIF ret scan endp SCANQ PROC NEAR ;扫描键盘输入 MOV AH,3 MOV BH,0 INT 10H MOV m_x,DL MOV m_y,DH MOV AH,2 MOV BH,0 DEC m_x MOV DL,m_x MOV DH,m_y mov dl,0 inc dh INT 10H MOV DX, OFFSET DSI5 MOV AH,9 INT 21H SCANQ1: CLI MOV AH,1 INT 21H .IF AL==79H ;若输入y则退出程序 MOV AX,4C00H INT 21H .ENDIF .IF AL==6eH ;若输入n则继续运行程序 MOV AL,3 MOV AH,0 INT 10H MOV DX,OFFSET DSI0 MOV AH,9 INT 21H MOV AH,3 MOV BH,0 INT 10H MOV m_x,DL MOV m_y,DH jmp main .ELSE CALL DISNULL JMP SCANQ1 .ENDIF RET SCANQ ENDP DISPLAY PROC NEAR ;显示单个数据的子程序 PUSH DX PUSH CX PUSH BX MOV CX,0 MOV BX,10 DISPX1: MOV DX,0 DIV BX PUSH DX INC CX OR AX,AX JNZ DISPX1 DISPX2: POP DX ;将资料转换成ASCII码 MOV AH,6 ADD DL,30H INT 21H LOOP DISPX2 POP BX POP CX POP DX RET DISPLAY ENDP DISNULL PROC FAR ;处理输入超出0~9范围的资料的子程序 MOV AH,3 ;读游标位置 MOV BH,0 INT 10H MOV m_x,DL MOV m_y,DH MOV AH,2 ;将游标横坐标左移一位 MOV BH,0 DEC DL INT 10H MOV AH,6 ;用空格代替超出范围的资料 MOV DL,' ' INT 21H MOV AH,2 ;置游标位置于空格前面 MOV BH,0 DEC m_x MOV DL,m_x MOV DH,m_y INT 10H RET DISNULL ENDP end ![]() [此贴被 286(unique) 在 11月21日09时30分 编辑过] |
地主 发表时间: 05-11-19 08:03 |
![]() | 回复: mydear00 [mydear00] ![]() |
登录 |
学单片机的,这个你都会,真利害,我原来学老师说设计个红绿灯程序我都没做出来,不过也毕业了, 想帮你,不行呀 ![]() |
B1层 发表时间: 05-11-19 20:01 |
![]() | 回复: ProgramLive [coolcall] ![]() |
登录 |
这是电脑汇编吧,没看到调用DOS功能吗? |
B2层 发表时间: 05-11-20 18:14 |
![]() | 回复: yzlz2008 [yzlz2008] ![]() |
登录 |
好强啊.什么时候教教小弟啊![]() ![]() |
B3层 发表时间: 05-11-25 10:57 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号