先说楼主的代码,也没啥错误,但有一句
ROR AL,4
这是8086汇编不允许的,须在文件开头的地方加一句
.286
再看看题目...
在数据段的变量BUF中有10个字节型无符号的十进制数,它们以无序的方式存放着,设计一个程序将这些数据按由小到大的方式排列起来,并在屏幕上输出排好序的这10个数。(两数之间用空格分开)
题目不太清晰,在内存中,除非特别指明是10进制的BCD,其实储存的都是16进制(也可以说是2进制),
既然说:无符号的十进制数(也没说是byte或word),可以理解为
buf db 07,12, ....... 99 ;共10个,没有h作后缀
另外也没说输出的是10进制还是16进制,但前面说存的是10进制,楼主代码却显示16进制,这可能出现歧异...
好吧,就改写成以10进制罗列资料,以10进制显示供楼主参考......
程序代码:
CODE SEGMENT
ASSUME CS:CODE
BUF DB 12,34,07,78,65,41,99,87,66,246
N EQU $-BUF
START: PUSH CS
POP DS
PUSH CS
POP ES
LEA SI,BUF
MOV CX,N
CALL SORT
LEA SI,BUF
MOV CX,N
CALL DSPBCD
MOV AH,4CH
INT 21H
;===============================
DSPBCD PROC NEAR
CLD
NEXT:
PUSH CX
LODSB
MOV AH,0
CALL PRINT_AX;印出AX值
MOV AH,2
MOV DL,20H ;显示空白
INT 21H
POP CX
LOOP NEXT
RET
DSPBCD ENDP
;===============================
;输出AX的ASCII到屏幕
PRINT_AX PROC NEAR
MOV CX,0 ;清0
MOV BX,10 ;除法准备
PPAX1:
MOV DX,0 ;清0
DIV BX ;AX /10 ,若1234 ,除10后,DL得余数4,
PUSH DX ;保存, AX=1234,依次保存4,3,2,1
INC CX ;累加个数
OR AX,AX ;是否已除尽
JNZ PPAX1 ;不是,再除
MOV BL,CL ;存个数
PPAX2:
POP DX ;后入先出,先印出第一数,然后第二....
OR DL,30H ;转ASCII
MOV AH,2 ;存入字串缓冲
INT 21H
LOOP PPAX2 ;下一个
RET
PRINT_AX ENDP
;===============================
; 单个字符串(或者字节数组)内部的排序(冒泡排序)
SORT PROC NEAR
; 串长度置入cx,串首地址置入 si
PUSH AX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
PUSH CX
POP DX
DEC DX
@SORTL1:
MOV CX,DX
MOV DI,SI
@SORTL2:
MOV AL,[DI+1]
CMP AL,[DI]
JA @SORTNEXT ; 无符号 升序
XCHG AL,[DI]
MOV [DI+1],AL
@SORTNEXT:
INC DI
LOOP @SORTL2
DEC DX
JNZ @SORTL1
POPF
POP DI
POP SI
POP DX
POP CX
POP AX
RET
SORT ENDP
;===============================================================
CODE ENDS
END START
[此贴子已经被作者于2018-6-19 06:43编辑过]