您的位置:首页 > 其它

汇编:输入姓名和成绩排序(别人的作业,自己随便写写的,没用传统的排序算法)

2012-05-09 08:18 423 查看
;我这是计算成绩从高到低的排序,因为我假设的情况是一个人一个成绩,
;所以如果你要的是一个人几个成绩进行排序;
;你就修改我下面的数据结构,再按照我自己编写的算法进行循环就行了
;很简单的,嫌麻烦,我就没写了
;--------------ebuf是我设置的数据结构-------;
;-2个字节用来存放数字的地址(数字显示出来的时候,就不需要再转换了)--------;
;-2个字节用来存放字符和数字的个数(我假设开始输入数据的时候不规范)---------;
;-2个字节是用来存放要用来排序的数字---------------------------------------;
;-2个字节用来存放字符的地址-----------------------------------------------;
;-1个字节是我设置的判断符-------------------------------------------------;

;--算法简单介绍如下--------------------------------------------------------;
;--假设 lf 55 zbx 99 lo 66-------------------------------------------------;
;--lf和zbx和lo比较,选出最大的把地址写入ebuf,判断符设置成ffh,以后不再参加比较-----;
;--依此类推,所以不用把内存移来移去------------------------------------------------;
;--这里面,其实主要是用了地址的地址来实现的---------------------------------------;

;--程序现在只是随便写写的,不完善。需要别的功能,修改修改就行了------------------;
assume cs:code,ds:data,ss:stack

data segment
ibuf db 0dh,0ah,"please input a number:$"
fbuf db 0dh,0ah,"------------------------------------------------------------------$"

bbuf db 0;计算总共有几个人的成绩
zbuf db 100
db ?
db 200 dup(?)
dbuf dw 100 dup(0);这里面存放的是数据结构
;------排序用的
ebuf dw 100 dup(0);这里面存放的是排序的结果地址
;----------------

sum dw 0
data ends

stack segment
db 200 dup (0)
stack ends
;---宏调用 判段是否数字 如果是数字 cf=0
Digital macro
local t2s,t3s
cmp BYTE ptr[si],30h
jb t2s
cmp BYTE ptr[si],39h
ja t2s
clc ;cf=0
jmp t3s
t2s: stc ;cf=1
t3s:
endm
;----------------------

;--宏调用 判段是否字母 如果是字母cf=0
Letter macro
local ts,ts2,ls3,tts
cmp BYTE ptr[si],65
jb ts
cmp BYTE ptr[si],122
ja ts
cmp BYTE ptr[si],90
ja ts2
tts:clc
jmp ts3
ts2:
cmp BYTE ptr[si],96
ja tts
ts:stc
ts3:
endm
sc macro op1,op2
mov bh,00h
mov dh,op1
mov dl,op2

mov ah,02h
int 10h
endm
;-------
clear_screen macro op1,op2,op3,op4 ;清屏宏定义 cx,屏幕的左上角,dx屏幕的右下角
mov ah,06h
mov al,00h
mov bh,0eh;改变行属性的色彩,字的色彩,bh空白行的属性/07就是正常的黑底白字
mov ch,op1
mov cl,op2
mov dh,op3
mov dl,op4
int 10h
mov ah,02h;设置光标的位置从0000开始
mov bh,00h
mov dh,00h
mov dl,00h
int 10h
endm

;-----------------------
code segment
start:
mov ax,data
mov ds,ax
lea dx,ibuf
mov ah,9
int 21h

lea dx,zbuf
mov ah,10
int 21h

mov cl,zbuf+1
mov ch,0
push cx
lea si,zbuf+2
dec cx
lea di,dbuf
zs:inc si
loop zs
pop cx
;---首先判断是否是数字,然后再判断是否是字符

ts:

mov dx,0
mov ax,1
mov bl,10
mov sum,0
tts:
Digital
jc dds   ;如果不是数字,不是转入zs
;---如果是数字,则处理

push ax
mov [di],si
mov bh,BYTE ptr[si]
sub bh,30h
mul bh
add sum,ax
pop ax
mul bl
dec si
inc dl
dec cx
cmp cx,0
jnz tts
jmp d3s
;是否是字母
dds:
Letter
jc d2s;有字母,cf=0,不是cf=1,这里是如果不是字母,转入d2s
inc dh
dec si
dec cx
cmp cx,0
jnz dds

;---
d2s:
cmp dh,0
jnz d3s;有字母,转入d3s处理
cmp dl,0
jz d4s;无字母,无数字,则转入d4s接着循环
;有数字,无字母
dec cx
dec si
cmp cx,0
jz d4s
jmp tts
d3s:
inc di
inc di
mov [di],dx;dh为字母个数,dl为数字个数
inc di
inc di
mov dx,sum
mov [di],dx
inc di
inc di
inc si
mov dx,si
mov [di],dx
inc di
inc di
mov [di],0
inc di
dec si
inc byte ptr [bbuf]
cmp cx,0
jnz ts
jmp d5s
d4s:
dec cx
dec si

cmp cx,0
jnz ts
d5s:

call sort

clear_screen 00d,00d,24d,79d

lea dx,fbuf
mov ah,9
int 21h
mov bh,00h
mov dh,02
mov dl,06

;----------------------------------------------------------------
;设置光标的位置从0000开始
lea si,ebuf
mov cl,BYTE ptr [bbuf]
mov ch,0
ses:
mov ah,02h
int 10h
push cx
push bx
push dx
mov bx,[si]

;-----字母循环----------显示名字------------------------
mov cl,BYTE ptr[bx+3]
mov ch,0
add bx,6
mov di,[bx]
dTs:
mov dl,BYTE ptr[di]
mov ah,2
int 21h
inc di
loop dTs
;-------其实这里可以在下面loop后面设置列的显示,只是这样的话,会比较麻烦,因为你要考虑滚屏的实施,虽然这样排版不美观,但要美观,就要用列!
mov cx,7
drrs:
mov dl,20h
mov ah,2
int 21h
loop drrs
;------------------显示数字
sub bx,6
mov cl,BYTE ptr[bx+2]
mov ch,0
mov di,[bx]
d2Ts:
mov dl,BYTE ptr[di]
mov ah,2
int 21h
inc di
loop d2Ts

pop dx
pop bx
inc dh
inc si
inc si

pop cx
loop ses

mov ax,4c00h
int 21h
;-----排序
sort proc near
push ax
push bx
push cx
push dx

lea di,ebuf
mov cl,BYTE ptr[bbuf];c
mov ch,0

;-------------------------
;---------------------------------------循环主数
szs:
push cx
mov cl,BYTE ptr[bbuf];c
mov ch,0
mov dx,cx
lea si,dbuf
srs:

cmp BYTE ptr[si+8],0ffh;si+8那个位置是我的判断符
jnz sortT
add si,9
dec cx
cmp cx,0;循环四个数
jnz srs;不是最后一个数,循环,找到没有被处理的
jmp rexit ;如果是最后一个数,就直接进入rexit去把数据放进ebuf里
;------------------------------------------

;--------------------------------------比较
sortT:
;..................把ah的地址放进di里
mov ah,BYTE ptr[si+4];
mov bx,si
mov [di],bx
;------------------主数和别的数,循环比较
sr2s:
cmp cx,1
jz rexit  ;如果只输入了一个成绩,就直接放到最后
sr22s:
dec cx
add si,9
cmp BYTE ptr[si+8],0ffh;往下移,看下一个数,有没有被处理
jnz sortT2;没有被处理,则进入sortT2进入比较

cmp cx,1
jnz sr22s;如果到底最后一个数,都被处理了,跳到rexit
jmp rexit
;---进行比较
sortT2:
mov al,BYTE ptr[si+4]
cmp ah,al
jae sr3s
;小于处理方式al>ah比较后,把大数放进ah里,di改成大数的地址,看看dx是不是为最后一个数,如果是,则退出循环,如果不是,则接着比较
mov ah,al
mov bx,si;
mov [di],bx
;--大于,,第一个地址设置成ffh看看cx还有几个数!如果为0,则退出rexit
sr3s:
cmp cx,1
jnz sr2s
rexit:
mov si,[di]
mov BYTE ptr[si+8],0ffh
inc di
inc di
pop cx
dec cx
cmp cx,0
jnz szs

;----上面是循环比较完后,在下面进入处理!
rexit2:

pop dx
pop cx
pop bx
pop ax
ret
sort endp
code ends
end start
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐