;对输入的成绩,输出每个成绩的名次,相同的成绩有相同的名次 data segment grade dw 78,79,50,99,85,46,12,36,89,87,89,87,45,87 ;成绩数组(dw字变量) count equ ($ - grade)/type grade ;统计成绩个数 rank dw count dup(?) ;存放名次的数组 (dw字变量) data ends stack segment stack ends code segment assume cs:code,ds:data,ss:stack start: mov ax,data mov ds,ax mov si,offset grade ;si中存放grade的首地址 mov di,offset rank ;di中存放rank的首地址 mov cx,0 ;用于判断所有成绩是否已全部判断完毕 loop1: push si ;保存当前判断的成绩地址 mov dx,0 ;当前成绩名次,找到一个比当前成绩dx+1 mov bx,count+1 ;bx用于每次从开始找的次数 mov ax,[si] ;提取当前地址的成绩 mov si,offset grade ;获得grade的首地址,因为每次都必须从第一个开始比较 dec si dec si ;为了更好的控制的循环,先使si向前移动一个字的位置 loop2: inc si inc si ;字变量,须两次递增 dec bx ;内层循环变量减1,每一个变量都好当前变量比较 je move_f ;当前变量比较完毕 cmp ax,[si] ;判断当前成绩是否大于比较的每一个变量 ja loop2 ;大于就继续判断 inc dx ;小于就名次加1 jmp loop2 move_f: mov word ptr[di],dx ;把当前成绩的名次存放到rank数组中去 pop si ;恢复si的地址 inc si inc si inc di inc di ;si,di分别累加,用于后移一个位置 inc cx ;判断是否所有成绩都比较完毕 cmp cx,count jna loop1 mov si,offset rank mov cx,count put_out: mov dx,[si] ;输出所有成绩的名次 add dx,30h cmp dx,'9' jna set add dx,07h set: mov ah,02h int 21h mov dx,' ' mov ah,02h int 21h inc si inc si loop put_out mov ah,4ch int 21h code ends end start