在数据区定义一个字节型变量a1,a1中存放了若个字符,'$'字符是其最后一个字符。
编写子程序
- a1中的所有字符输出显示,直到‘$’结束(需要用循环实现)
- 输出回车换行符号和逗号
- 用提示信息提示用户输入8个数,以非数字字符结束,每个数输入后输出换行,在下一行输入下一个数,每个数存到内存;
- 输入后在新的一行显示这8个数;
- 然后对这8个数排序;
- 在新的一行显示排序后的8个数。
示例:
Please input 8 number:
23a
46c
.......
Before sort,the 8 nunber is: 23,46,.....
After sort,the 8 nunber is: ......
代码:
DATAS SEGMENT;此处输入数据段代码 STRING1 DB 'Please input 8 number between0-255$' A1 DB 11,22,33,44,55,66,77,88STRING2 DB 'Before sort,the 8 nunber is:$'STRING3 DB 'After sort,the 8 nunber is:$'
DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码
STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS
START:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV DX, OFFSET STRING1CALL OUTPUTSTRMOV SI,OFFSET A1MOV BL,8
L0:;输入8个数CALL OUTPUTCRLFCALL INPUT;SI入口参数 SUB BL,1ADD SI,1CMP BL,0JA L0CALL OUTPUTCRLFMOV DX, OFFSET STRING2CALL OUTPUTSTRMOV BL,8 MOV SI,OFFSET A1
L1:;输出排序前8个数CALL OUTPUT;SI入口参数 CALL OUTDOUSUB BL,1ADD SI,1;DB为加1CMP BL,0JA L1MOV DI,OFFSET A1CALL SORTCALL OUTPUTCRLFMOV DX, OFFSET STRING3CALL OUTPUTSTRMOV BL,8 MOV SI,OFFSET A1
L2:;输出排序后8个数CALL OUTPUT;SI入口参数 CALL OUTDOUSUB BL,1ADD SI,1;DB为加1CMP BL,0JA L2 MOV AH,4CHINT 21H;子程序
OUTPUTCRLF PROC;输入回车符 CR LF的asciiPUSH AXPUSH DXMOV DL,13;CR 13MOV AH,2INT 21HMOV DL,10;LF 10MOV AH,2INT 21HPOP AXPOP DXRET
OUTPUTCRLF ENDPOUTDOU PROC;输出英文逗号PUSH AXPUSH DXMOV DL,44MOV AH,2INT 21HPOP DXPOP AXRET
OUTDOU ENDP OUTPUTSTR PROC;显示字符串PUSH AXMOV AH,9INT 21HPOP AXRET
OUTPUTSTR ENDPINPUT PROC ;输入数字存到内存 SI入口参数PUSH AXPUSH BXPUSH CXPUSH DXMOV BL,10MOV DL,0
BEGIN:MOV AH,1INT 21HSUB AL,48CMP AL,0JB OVERCMP AL,9JA OVERMOV CL,ALMOV AL,DLMUL BLADD AL,CLMOV DL,ALJMP BEGIN
OVER:MOV [SI],DLPOP DXPOP CXPOP BXPOP AXRET
INPUT ENDPOUTPUT PROC;显示多位数字 SI入口参数PUSH AXPUSH BXPUSH CXPUSH DXMOV AH,0MOV AL,[SI]MOV BL,10MOV CL,0
OUT0: DIV BLPUSH AXADD CL,1MOV AH,0CMP AL,0JNE OUT0OUT1:POP DXMOV DL,DHADD DL,48MOV AH,2INT 21HSUB CL,1;;计数器减1CMP CL,0JNE OUT1POP DXPOP CXPOP BXPOP AXRET
OUTPUT ENDP;DB型 地址全部为加减1 用寄存器的一半
SORT PROC ;冒泡排序 DI入口参数PUSH SIPUSH BXPUSH CXPUSH DXMOV BX,DIADD BX,8 ;BX控制最外层循环 值为个数大于8也对,小于8最后面不排序
SL0:MOV SI,DICMP BX,DI ;循环次数为需要排序的个位+1JBE OVERSUB BX,1 ;减的早,所以一开始赋值为8SUB SI,1 ;下面循环SI加的早,先减去1在加1
SL1:ADD SI,1 ;放在循环结束的位置麻烦CMP SI,BX ;从0到没有排序的最后1个数JAE SL0 ;进入外层循环MOV CL,[SI] ;把内存的数放在寄存器中MOV DL,[SI+1]CMP CL,DL ;比较两个数 大的放后面JBE SL1 ;不需要换位置直接进入下一内层循环MOV [SI],DL ;需要换位置,直接更新内存的数MOV [SI+1],CLJMP SL1 ;进入下一内层循环
OVER:POP DXPOP CXPOP BXPOP SIRET
SORT ENDP
CODES ENDS END START
结果: