一个汇编程序的问题 高手指教

来源:百度知道 编辑:UC知道 时间:2024/05/21 16:27:42
.386
DATAS SEGMENT USE16
STU0 DB 65,76,89,90,87
STU1 DB 77,68,92,82,80
STU2 DB 59,69,73,71,80
STU3 DB 82,90,94,88,93
STU4 DB 65,76,81,74,79
STU5 DB 90,93,92,100,95
STU6 DB 80,65,78,78,60
STU7 DB 72,70,69,84,77
STU8 DB 85,86,93,97,90
STU9 DB 43,59,62,69,70
SUM DW 10 DUP(0)
FINAL DB 4 DUP(?)
MESG1 DB 'Input student number:$'
MESG2 DB 'Total score:$'
DATAS ENDS

CODES SEGMENT USE16
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA SI,STU0
LEA BP,SUM
MOV BX,10

LOOP_ROW:
MOV CX,5
LOOP_LINE:
MOV DL,[SI]
XOR DH,DH
ADD WORD PTR [BP],DX
INC SI
DEC CX
CMP CX,0
JA LOOP_LINE
ADD BP,2
DEC BX
CMP BX,0
JA LOOP_ROW

NEXT:

MOV AH,1
INT 21H
SHL AL,1 ;AL左移一位,查找SUM中第(A

1、总体评价 

这个程序,结构清晰、层次分明,数据段中相关数据的定义也不错,从数据结构的设计来看,数据结构设计合理,是挺好的。 

程序设计领域有句名言:数据结构+算法=程序 

但从算法角度来看,尚属初级阶段,显得很笨拙。 

计算每个学生总成绩的程序段没毛病。 

2、问题所在 

问题出在: 

--------------------------------------- 

OUTPUT: 

MOV CX,10 

DIV CX ;除以10,余数(存放在AH中)为个位 

MOV [BP],AH 

INC BP 

XOR AH,AH ;余数存入FINAL并清零用来存放余数的AH,商AL作为被除数进行下一轮的除法 

CMP AL,0 

JA OUTPUT ;若商(AL)大于0继续除 

--------------------------------------- 

楼主对除法指令的理解好似模糊,请看下面关于除法指令的描述: 

除法指令的被除数是隐含操作数,除数在指令中显式地写出来。CPU会根据除数是8位、16位,还是32位,来自动选用被除数AX、DX-AX,还是EDX-EAX。 

除法指令功能是用显式操作数去除隐含操作数,可得到商和余数。当除数为0,或商超出数据类型所能表示的范围时,系统会自动产生0号中断。 

* 无符号数除法指令DIV(Unsigned Divide Instruction) 

指令的格式:DIV Reg/Mem 

指令的功能是用显式操作数去除隐含操作数(都作为无符号数),所得商和余数按表5.3的对应关系存放。指令对标志位的影响无定义