汇编 正负数排列

题目是:随机几个正负数, 输出要求是正数从大到小排列,负数从小到大排列。
麻烦汇编高手帮忙编写哈代码, 谢谢!

; 题目名称:随机几个正负数, 输出要求是正数从大到小排列,负数从小到大排列
; 题目来源:http://zhidao.baidu.com/question/131775278.html
; 本程序在MASMPlus 1.2集成环境下通过编译,经过调试,运行正确。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
; 功能:在当前光标位置显示一个字符
; 入口:dl=要显示的字符
Output_Chr proc Near
push ax
mov ah,2
int 21h
pop ax
ret
Output_Chr Endp
; -------------------------------------
; 功能:把AX中的二进制有符号数转换成显式的十进制ASCII码,并送显示屏显示
; 入口:AX=二进制数
; 出口:在当前光标位置显示转换后的ASCII码数字
Sign_Dec_ASCII Proc Near
push ds
push cs
pop ds
push cs
pop es
push dx
push bx
push di
test ah,80h
jz @@Tran_ASCII
neg ax
push ax
mov dl,'-'
mov ah,2
int 21h
pop ax
@@Tran_ASCII: mov bx,10
lea di,@@Temp_SaveS[5]
mov BYTE ptr [di],'$'
dec di
cld
@@Divide_S: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide_S
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
pop ds
ret
@@Temp_SaveS db 6 dup(?)
Sign_Dec_ASCII EndP
; -------------------------------------
; 功能:冒泡排序法将数组元素升序或降序排序,显示排序结果
; 入口参数:SI=数组地址(第一个元素存放元素个数),AL=排序方向
Bubbling_Sort proc Near
push si
mov BYTE ptr @@Compare[5],al ;修改排序方向
mov cl,[si] ;数据个数
xor ch,ch
dec cx ;外循环次数
inc si
cld
@@Scanning: push cx ;入栈保存外循环次数
push si ;入栈保存数组地址
@@Compare: mov di,si ;当前数组元素地址赋给目的变址寄存器,以备交换之用
lodsb ;将当前数组元素读入累加器
cmp al,[si] ;当前数组元素与相邻的下一个数组元素相比较
jae @@NextOne ;若大于或等于,不作数据交换,处理下一个数组元素
xchg al,[si] ;若小于,交换数组元素
stosb ;保存数值较小者
@@NextOne: loop @@Compare ;处理下一个数组元素
pop si ;数组地址出栈
pop cx ;外循环次数出栈
loop @@Scanning ;下一趟比较
mov cl,[si-1] ;数据个数
xor ch,ch
@@List_Scores: lodsb
cbw ;扩展为字
call Sign_Dec_ASCII ;把AX中的二进制有符号数转换成显式的十进制ASCII码,并送显示屏显示
mov dl,20h
call Output_Chr ;显示一个空格
loop @@List_Scores
pop si
ret
Bubbling_Sort Endp
; -------------------------------------
Buffer db 23,-69,-89,35,-46,57,-68,79,-51,-81,98,-43,56,-67,123,-98,102,-87,-91,-100
Counter equ $-Buffer ;数据个数
Press_Key db 13,10,10,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es
xor dx,dx ;DH=正数数组元素计数器,DL=负数数组元素计数器
lea si,Buffer ;取数组变量地址
lea di,Tmp_Buffer[1] ;正数数组地址
mov bx,di
mov cx,Counter ;元素个数
add bx,cx
inc bx ;负数数组地址
cld
@@Statics: lodsb ;读入一个元素
test al,80h ;正数?
jz $+9 ;是
inc dl ;负数计数
mov [bx],al ;保存负数
inc bx
jmp $+5
inc dh ;是,正数计数
stosb ;保存正数
loop @@Statics
lea si,Tmp_Buffer ;正数数组地址
mov [si],dh ;保存正数数组元素个数
mov [si][21],dl ;保存负数数组元素个数
mov al,73h ;排序方向代码:降序
call Bubbling_Sort ;排序并显示
mov ax,0e0dh
xor bx,bx
int 10h
mov al,10
int 10h
int 10h
add si,21 ;负数数组地址
mov al,76h ;排序方向代码:升序
call Bubbling_Sort ;排序并显示
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Tmp_Buffer: ;数据缓冲区
Code ENDS
END Start ;编译到此结束
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-01-17
表示源操作数是正数或者是0,所以,(AL)>=0。
第2个回答  2010-01-17
老汤答题,没的说了
相似回答