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

来源:互联网 发布:阿里云公网ip端口映射 编辑:程序博客网 时间:2024/04/28 19:09
;我这是计算成绩从高到低的排序,因为我假设的情况是一个人一个成绩,;所以如果你要的是一个人几个成绩进行排序;;你就修改我下面的数据结构,再按照我自己编写的算法进行循环就行了;很简单的,嫌麻烦,我就没写了;--------------ebuf是我设置的数据结构-------;;-2个字节用来存放数字的地址(数字显示出来的时候,就不需要再转换了)--------;;-2个字节用来存放字符和数字的个数(我假设开始输入数据的时候不规范)---------;;-2个字节是用来存放要用来排序的数字---------------------------------------;;-2个字节用来存放字符的地址-----------------------------------------------;;-1个字节是我设置的判断符-------------------------------------------------;;--算法简单介绍如下--------------------------------------------------------;;--假设 lf 55 zbx 99 lo 66-------------------------------------------------;;--lf和zbx和lo比较,选出最大的把地址写入ebuf,判断符设置成ffh,以后不再参加比较-----;;--依此类推,所以不用把内存移来移去------------------------------------------------;;--这里面,其实主要是用了地址的地址来实现的---------------------------------------;;--程序现在只是随便写写的,不完善。需要别的功能,修改修改就行了------------------;assume cs:code,ds:data,ss:stackdata segmentibuf db 0dh,0ah,"please input a number:$"fbuf db 0dh,0ah,"------------------------------------------------------------------$"bbuf db 0;计算总共有几个人的成绩zbuf db 100db ?db 200 dup(?)dbuf dw 100 dup(0);这里面存放的是数据结构;------排序用的ebuf dw 100 dup(0);这里面存放的是排序的结果地址;----------------sum dw 0data endsstack segmentdb 200 dup (0)stack ends;---宏调用 判段是否数字 如果是数字 cf=0Digital macrolocal t2s,t3scmp BYTE ptr[si],30hjb t2scmp BYTE ptr[si],39hja t2sclc ;cf=0 jmp t3st2s: stc ;cf=1t3s:endm;----------------------;--宏调用 判段是否字母 如果是字母cf=0Letter macrolocal ts,ts2,ls3,ttscmp BYTE ptr[si],65jb tscmp BYTE ptr[si],122ja tscmp BYTE ptr[si],90ja ts2tts:clcjmp ts3ts2:cmp BYTE ptr[si],96ja ttsts:stcts3:endmsc macro op1,op2mov bh,00hmov dh,op1mov dl,op2mov ah,02hint 10hendm;-------clear_screen macro op1,op2,op3,op4 ;清屏宏定义 cx,屏幕的左上角,dx屏幕的右下角mov ah,06hmov al,00hmov bh,0eh;改变行属性的色彩,字的色彩,bh空白行的属性/07就是正常的黑底白字mov ch,op1mov cl,op2mov dh,op3mov dl,op4int 10hmov ah,02h;设置光标的位置从0000开始mov bh,00hmov dh,00hmov dl,00hint 10hendm;-----------------------code segmentstart:mov ax,datamov ds,axlea dx,ibufmov ah,9int 21hlea dx,zbufmov ah,10int 21hmov cl,zbuf+1mov ch,0push cxlea si,zbuf+2dec cxlea di,dbufzs:inc siloop zspop cx;---首先判断是否是数字,然后再判断是否是字符ts:mov dx,0mov ax,1mov bl,10mov sum,0tts:Digitaljc dds   ;如果不是数字,不是转入zs;---如果是数字,则处理push axmov [di],simov bh,BYTE ptr[si]sub bh,30hmul bhadd sum,axpop axmul bldec siinc dldec cxcmp cx,0jnz ttsjmp d3s ;是否是字母dds:Letterjc d2s;有字母,cf=0,不是cf=1,这里是如果不是字母,转入d2sinc dhdec sidec cxcmp cx,0jnz dds ;---d2s:cmp dh,0jnz d3s;有字母,转入d3s处理cmp dl,0jz d4s;无字母,无数字,则转入d4s接着循环;有数字,无字母dec cxdec sicmp cx,0jz d4sjmp ttsd3s:inc diinc dimov [di],dx;dh为字母个数,dl为数字个数inc diinc dimov dx,summov [di],dxinc diinc diinc simov dx,simov [di],dxinc diinc dimov [di],0inc didec siinc byte ptr [bbuf]cmp cx,0jnz tsjmp d5sd4s:dec cxdec sicmp cx,0jnz tsd5s:call sortclear_screen 00d,00d,24d,79dlea dx,fbufmov ah,9int 21hmov bh,00hmov dh,02mov dl,06;----------------------------------------------------------------;设置光标的位置从0000开始lea si,ebufmov cl,BYTE ptr [bbuf]mov ch,0ses:mov ah,02hint 10hpush cxpush bxpush dxmov bx,[si];-----字母循环----------显示名字------------------------mov cl,BYTE ptr[bx+3]mov ch,0add bx,6mov di,[bx]dTs:mov dl,BYTE ptr[di]mov ah,2int 21hinc diloop dTs;-------其实这里可以在下面loop后面设置列的显示,只是这样的话,会比较麻烦,因为你要考虑滚屏的实施,虽然这样排版不美观,但要美观,就要用列!mov cx,7drrs:mov dl,20hmov ah,2int 21hloop drrs;------------------显示数字sub bx,6mov cl,BYTE ptr[bx+2]mov ch,0mov di,[bx]d2Ts:mov dl,BYTE ptr[di]mov ah,2int 21hinc diloop d2Tspop dxpop bxinc dhinc siinc sipop cxloop sesmov ax,4c00hint 21h;-----排序sort proc nearpush axpush bxpush cxpush dxlea di,ebufmov cl,BYTE ptr[bbuf];cmov ch,0;-------------------------;---------------------------------------循环主数szs:push cxmov cl,BYTE ptr[bbuf];cmov ch,0mov dx,cxlea si,dbufsrs:cmp BYTE ptr[si+8],0ffh;si+8那个位置是我的判断符jnz sortTadd si,9dec cxcmp cx,0;循环四个数jnz srs;不是最后一个数,循环,找到没有被处理的jmp rexit ;如果是最后一个数,就直接进入rexit去把数据放进ebuf里;------------------------------------------;--------------------------------------比较sortT:;..................把ah的地址放进di里mov ah,BYTE ptr[si+4];mov bx,simov [di],bx;------------------主数和别的数,循环比较sr2s:cmp cx,1jz rexit  ;如果只输入了一个成绩,就直接放到最后sr22s:dec cxadd si,9cmp BYTE ptr[si+8],0ffh;往下移,看下一个数,有没有被处理jnz sortT2;没有被处理,则进入sortT2进入比较cmp cx,1jnz sr22s;如果到底最后一个数,都被处理了,跳到rexitjmp rexit;---进行比较sortT2:mov al,BYTE ptr[si+4]cmp ah,aljae sr3s;小于处理方式al>ah比较后,把大数放进ah里,di改成大数的地址,看看dx是不是为最后一个数,如果是,则退出循环,如果不是,则接着比较mov ah,almov bx,si;mov [di],bx;--大于,,第一个地址设置成ffh看看cx还有几个数!如果为0,则退出rexitsr3s:cmp cx,1jnz sr2srexit:mov si,[di]mov BYTE ptr[si+8],0ffhinc diinc dipop cxdec cxcmp cx,0jnz szs;----上面是循环比较完后,在下面进入处理!rexit2:pop dxpop cxpop bxpop axretsort endpcode endsend start


原创粉丝点击