一个排序题目,主要不太理解他的存储。
他不用转化的,ascii码直接比较码?
帮帮小弟
.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 '请输入10个数字:$'
msg2 db '排列后的数字如下:$'
numbers dw 0ah dup(?)
InputBuffer db 80h dup(?)
;---------------------------------------------------------------
end start
|