如何用汇编语言实现排序

题目如下:键盘输入10个无符号数(长度为2字节,自己设计具体值,应包括2位和3位数值),将其保存在内存中并显示在屏幕上,再由小到大排序,将结果保存到内存中并显示在屏幕上... 题目如下:键盘输入10个无符号数(长度为2字节,自己设计具体值,应包括2位和3位数值),将其保存在内存中并显示在屏幕上,再由小到大排序,将结果保存到内存中并显示在屏幕上 展开
 我来答
NJGQZF
2015-06-05 · TA获得超过1.1万个赞
知道大有可为答主
回答量:3165
采纳率:0%
帮助的人:1239万
展开全部
用汇编语言实现排序,通常使用冒泡法。将数据段DATA开始的16个数排序,前小后大,程序示例如下:
DATAS SEGMENT
DATA DB 74,68,58,66,69,254,186,6,10,98,34,90,128,222,33,0
COUNT DB 10H
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
MOV BL,1 ;用BL来检验是否排序完成,减少循环次数
LOOP1:
CMP BL,0
JE CMPEND ;若相等则跳转
XOR BL,BL ;将BL清零
MOV CL,COUNT ;COUNT用于外层的计数
DEC CL ;CL减一,CL用于内层的计数
PUSH CX ;将CX压入堆栈
LEA DI,DATA ;将数据段首地址赋值给DI
LOOP2:
MOV AL,[DI]
CMP AL,[DI+1] ;将前一个数与后一个数比较
JLE LOOP3 ;若前一个数小于或等于后一个数,则跳转到LOOP3
XCHG [DI+1],AL;前者大于后者,则交换两数
MOV [DI],AL ;如果前一个数字大于后一个数字,则交换
MOV BL,1
LOOP3:
INC DI ;指针加一
LOOP LOOP2 ;循环L00P2,直到CX==0成立
POP CX ;将CX从堆栈中弹出
MOV COUNT,CL ;改变外层计数器的值
JMP LOOP1
CMPEND:
MOV AH,4CH ;带返回码结束功能
INT 21H ;返回系统
CODES ENDS
END START
百度网友718258d
2009-11-10 · TA获得超过1079个赞
知道小有建树答主
回答量:288
采纳率:0%
帮助的人:0
展开全部
;此程序也支持有符号数
.286
.model small
;---------------------------------------------------------------
.code
start:
push cs
pop ds
push cs
pop es

mov ah,09h
mov dx,offset msg1
int 21h

;输入功能从这里开始
mov dx,offset InputBuffer
sub bx,bx
mov ah,3fh
mov cx,80h
int 21h

mov si,offset InputBuffer
mov di,offset numbers
sub ax,ax
mov cx,0ah

@InputLoop:
sub bx,bx
sub bp,bp

call Skip
cmp al,'+'
je @Positive
cmp al,'-'
jne @SignEnd
inc bp
@Positive:
mov al,[si]
inc si
@SignEnd:

@ReadBegin:
sub al,'0'
jl @ReadEnd
cmp al,9
jg @ReadEnd
imul bx,bx,0ah
add bx,ax
mov al,[si]
inc si
jmp @ReadBegin
@ReadEnd:

or bp,bp
je @SignChanged
neg bx
@SignChanged:
mov [di],bx
inc di
inc di
loop @InputLoop
;输入数字到这里结束

;排序开始,用冒泡排序
mov cx,9*2
mov si,offset numbers
@Outer:
sub bx,bx
@Inner:
mov ax,[bx+si]
cmp ax,[bx+si+02h]
jng @Changed
push [bx+si+02h]
mov [bx+si+02h],ax
pop [bx+si]
@Changed:
inc bx
inc bx
cmp bx,cx
jl @Inner
dec cx
dec cx
jg @Outer
;排序结束

;输出数字开始
mov ah,09h
mov dx,offset msg2
int 21h

mov di,offset numbers
mov cx,0ah
mov bp,cx

@OutputLoop:
sub si,si
mov ax,[di]
mov bx,ax
inc di
inc di
cmp ax,0
jnl @PushNumber
neg ax

@PushNumber:
sub dx,dx
div bp
add dl,'0'
push dx
inc si
or ax,ax
jne @PushNumber

cmp bx,0
jnl @PopNumber
push '-'
inc si

@PopNumber:
pop dx
mov ah,02h
int 21h
dec si
jnz @PopNumber

mov ah,02h
mov dl,' '
int 21h
loop @OutputLoop
;输出数字到这里结束

mov ah,4ch
int 21h
;---------------------------------------------------------------
Skip proc near
@Skip: ;Skip blank and table
mov al,[si]
inc si
cmp al,' '
je @Skip
cmp al,09h
je @Skip
ret
Skip endp
;---------------------------------------------------------------
msg1 db 'Please enter the 10 digits:$'
msg2 db 'After the arrangement is as follows:$'
numbers dw 0ah dup(?)
InputBuffer db 80h dup(?)
;---------------------------------------------------------------
end start
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
做而论道
高能答主

2022-05-27 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部

下图程序,就可以实现。

反相显示的,就是排序部分。

本程序已经经过实验。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式