;算法为:一个学生的名次等于成绩高于该生的学生人数加1
RANKP PROC NEAR
MOV DI,COUNT MOV BX,0 _LOOP:
MOV AX,GRADE[BX] ;取学生成绩
MOV WORD PTR RANK[BX],0 ;初始化RANK[BX]的值为0 MOV CX,COUNT
LEA SI,GRADE ;第一个学生的成绩 _NEXT1:
CMP AX,[SI] ;比较两个成绩
JG _JUMP ;成绩大于被比较的跳过 INC WORD PTR RANK[BX] _JUMP:
ADD SI,2 ;取下一个被比较成绩的地址 LOOP _NEXT1
ADD BX,2 ; 下一个成绩
DEC DI ;未比较成绩个数减1 JNE _LOOP RET RANKP ENDP
;OUTPUT程序段
;从rank数组取得一个班的学生名次。把一个班的学生名次以学号为序在终端显示出来 ;调用子模块binidec,以便把rank数组中的二进制数转成十进制数并在终端上显示出来.调用子模块crlf完成回车,换行功能.
OUTPUT PROC NEAR
LEA DX,SHOW MOV AH,09H INT 21H
MOV SI,0
MOV DI,COUNT _NEXT2:
MOV BX,RANK[SI] ;将成绩保存到BX中 CALL BINIDEC ;调用BINIDEC
CMP DI,1 ;将剩余的成绩个数与1比较,若为1则不显示',' JE _NOCOMMA MOV DL,',' MOV AH,02H
INT 21H ;显示','
_NOCOMMA:
ADD SI,02H ;取下一个成绩名次 DEC DI
JNZ _NEXT2
MOV DX,OFFSET CR ;换行 MOV AH,9 INT 21H RET OUTPUT ENDP
;DECIBIN程序段
;从键盘取得一个十进制数。把该数转换成二进制数并存入BX寄存器中。
DECIBIN PROC NEAR
MOV BX,0 _CATCH:
MOV AH,01H INT 21H
MOV DL,AL
SUB AL,30H
JL _ENDCHANGE ;小于则结束SFVOF=1 CMP AL,39H
JG _ENDCHANGE ;大于则结束 CBW
XCHG AX,BX ;AX与BX值交换 MOV CX,10
MUL CX ;无符号数乘法指令,(AX)<----(AL)*(CX)
XCHG AX,BX
ADD BX,AX ;(BX)<------(BX)+(AX) JMP _CATCH _ENDCHANGE:
RET DECIBIN ENDP
;BINIDEC程序段
;把bx寄存器中的二进制数转换成10进制数,并在终端屏幕上显示出来。调用dec_div来作除法运算并显示字符。
BINIDEC PROC NEAR
PUSH BX PUSH CX PUSH SI
PUSH DI ;压栈
MOV CX,10
CALL DEC_DIV ;调用DEC_DIV
MOV CX,1
CALL DEC_DIV ;调用DEC_DIV
POP DI POP SI POP CX
POP BX ;出栈 RET BINIDEC ENDP
;DEC_DIV程序段
;把bx中二进制数除以相应的十的幂,并在屏幕上显示一位商。余数保存在bx寄存器中。
DEC_DIV PROC NEAR
MOV AX,BX MOV DX,0 DIV CX
MOV BX,DX MOV DL,AL ADD DL,30H
MOV AH,02H
INT 21H ;显示 RET DEC_DIV ENDP
CODE ENDS END START
运行结果:
1、 思考题:
(1)写出4位BCD码转二进制数的算法。 设AX寄存器中存放着4位BCD码 BCDTO2 PROC NEAR PUSH BX PUSH CX PUSH DX
MOV BX, AX ;保存AX中的BCD码到BX MOV AX, 0 ;结果单元清0
MOV CX, 4 ;共处理4位BCD码 RETRY: PUSH CX MOV CL, 4
ROL BX, CL ;最高1位BCD码移到BX中的低半字节 POP CX
MUL W10 ;累加和AX x 10 -> DX:AX PUSH BX
AND BX, 000FH ;取出BX中的1位BCD码 ADD AX, BX ;累加到AX中 POP BX LOOP RETRY POP DX POP CX POP BX RET BCDTO2 ENDP
(2) 写出AX中进二制数转BCD码的算法。
W1000 DW 1000,100,10,1 ;十进制数千,百,十,个位权值 ;入口参数:AX=二进制数。出口参数:AX=压缩BCD码 AX2TOBCD PROC NEAR
XOR BX, BX ;BCD码暂存单元清0 MOV SI, OFFSET W1000 ;权值首地址送SI MOV CX, 4 ;循环次数4 -> CX RETRY: PUSH CX
MOV CL, 4 SHL BX, CL
MOV DX, 0 ;DX:AX组成被除数
DIV WORD PTR[SI] ;除以权值,商,余数在AX,DX中 OR BX, AX ;压缩BCD码 MOV AX, DX ;余数送AX POP CX
ADD SI, 2 ;地址加2,指向下一权值 LOOP RETRY
MOV AX, BX ;BCD码由BX -> AX RET
AX2TOBCD ENDP