一道汇编的程序 希望有高手解释一下~

来源:百度知道 编辑:UC知道 时间:2024/06/16 02:01:24
建立学生名次表rank
以grade为首地址的10个字的数组中保存了学生的成绩,其中grade+i保存学号为i+1(i是从0到9的自然数)的学生的成绩。要求建立一个10个字的rank数组,并根据grade中的学生成绩将学生的名次填入rank数组中,其中rank+i的内容是学号为i+1学生的名次(提示:一个学生的名次等于成绩高于该学生的人数加1)。

DATA SEGMENT
GRADE DW 88,75,95,63,98,78,87,73,90,60
RANK DW 10 DUP (?)
DATA ENDS
;------------------------------------------------------------------------------
PROGNAM SEGMENT
ASSUME CS:PROGNAM , DS:DATA
MAIN PROC FAR
START:
MOV AX , DATA
MOV DS , AX
MOV CX , 10
MOV BX , 0
CYCLE:
PUSH CX
MOV AX , GRADE[BX]
MOV DX , 0
LEA SI , GRADE
NEXT:
CMP AX , [SI]
JG NOCOUNT
INC DX
NOCOUNT:
ADD SI , 2
LOOP NEXT
MOV RANK[BX] , DX

;定义数据段,不说了。
DATA SEGMENT
GRADE DW 88,75,95,63,98,78,87,73,90,60
RANK DW 10 DUP (?)
DATA ENDS
;------------------------------------------------------------------------------
;代码段
PROGNAM SEGMENT
ASSUME CS:PROGNAM , DS:DATA
MAIN PROC FAR ;定义函数。
START: ;程序的入口。
MOV AX , DATA
MOV DS , AX ;初始化数据段的段地址。
MOV CX , 10 ;设置循环次数为10
MOV BX , 0 ;BX存放当前被处理的数据在数组中的索引值,初始化为0。
CYCLE: ;外层循环的起始点。
PUSH CX ;保存循环计数(下面的pop CX用来恢复这个计数)。
MOV AX , GRADE[BX] ;取出第BX个学生的成绩,放到AX寄存器中(即当前处理的学生的成绩)。
MOV DX , 0 ;存放当前处理的学生的名次。初始化为0.
LEA SI , GRADE ;取数组的起始偏移地址,放到SI寄存器中。
MOV CX,10 ;个人认为这里应该加上这一句。原来的应该得不到正确的结果。但是没有试验。下面会用C语言来解释这段代码。
NEXT: ;内层循环的起始点。该循环用来找出成绩比AX高的学生人数+1。
CMP AX , [SI] ;用AX和DS:[SI]比较,
JG NOCOUNT ;如果AX大则跳过INC DX
INC DX ;AX不大于DS:[SI]则DX自增一次。
NOCOUNT:
ADD SI , 2 ;使SI加2以指向下一个被计较的对象。
LOOP NEXT ;内层循环。CX不为0则跳到NEXT。
MOV RANK[BX] , DX ;把DX(此时是第BX个学生的排名