主题:这个有关数组的程序错在哪里?
首先,看完代码后也请不要骂我,我们那个crazy老师在刚讲了最基本的几句代码(MOV、ADD)之后,就命我们在三天之后(中间没再上过一节汇编课)写出一个有关数组遍历的程序。我是硬啃着书才勉强挤出这段程序的。我连什么.DATA .CODE,中断都不知道。
我只想知道为什么出错,这个程序的目的是在长度为8的字节数组中,查找大于42H的无符号数的个数,存放在字节单元up中;等于42H的无符号数的个数,存放在字节单元equa中;小于42H的无符号数的个数,存放在字节单元down中。
最后程序显示up equa down的值
.MODEL SMALL
.DATA
data1 DB 31H,21H,42H,52H,87H,23H,98H,01H
count DB 8H
search DB 42H
up DB 0H
down DB 0H
equa DB 0H
upString db 0ah,0dh,'UP Number:$'
downString db 0ah,0dh,'Down Number:$'
equaString db 0ah,0dh,'Eqau Number:$'
.CODE
START:
MOV AX,@DATA
MOV DS,AX
MOV BL,COUNT ;取出COUNT的内容8H放入BL中
MOV DL,SEARCH
MOV AL,[DATA1+BX] ;取出数组中的值
CMP DL,AL ;与SEARCH比较大小
JZ EQAULZ ;等于则跳到EQAULZ
JNS DOWNZ ;小于则跳到DOWNZ
JS UPZ ;大于则跳到UPZ
EQAULZ:
INC EQUA
DEC COUNT ;计数器
CMP COUNT,1H ;等于1就退出
JNS START
JZ EXIT
UPZ:
INC UP
DEC COUNT
CMP COUNT,1H
JNS START
JZ EXIT
DOWNZ:
INC DOWN
DEC COUNT
CMP COUNT,1H
JNS START
JZ EXIT
EXIT: MOV DX,OFFSET UPSTRING ;调用中断在屏幕上显示出结果
MOV AH,09H
INT 21H
MOV BL,UP
MOV BH,30H
ADD BL,BH
MOV DL,BL
MOV AH,02H
INT 21H
MOV DX,OFFSET DOWNSTRING
MOV AH,09H
INT 21H
MOV BL,DOWN
MOV BH,30H
ADD BL,BH
MOV DL,BL
MOV AH,02H
INT 21H
MOV DX,OFFSET EQUASTRING
MOV AH,09H
INT 21H
MOV BL,EQUA
MOV BH,30H
ADD BL,BH
MOV DL,BL
MOV AH,02H
INT 21H
MOV AX,4C00H
INT 21H
END START
我最后的结果是正确的,可是只要改动31H,21H,42H,52H,87H,23H,98H,01H的前两个数屈据,马上就会出问题(改后面6个数据却不会)
我只想知道为什么出错,这个程序的目的是在长度为8的字节数组中,查找大于42H的无符号数的个数,存放在字节单元up中;等于42H的无符号数的个数,存放在字节单元equa中;小于42H的无符号数的个数,存放在字节单元down中。
最后程序显示up equa down的值
.MODEL SMALL
.DATA
data1 DB 31H,21H,42H,52H,87H,23H,98H,01H
count DB 8H
search DB 42H
up DB 0H
down DB 0H
equa DB 0H
upString db 0ah,0dh,'UP Number:$'
downString db 0ah,0dh,'Down Number:$'
equaString db 0ah,0dh,'Eqau Number:$'
.CODE
START:
MOV AX,@DATA
MOV DS,AX
MOV BL,COUNT ;取出COUNT的内容8H放入BL中
MOV DL,SEARCH
MOV AL,[DATA1+BX] ;取出数组中的值
CMP DL,AL ;与SEARCH比较大小
JZ EQAULZ ;等于则跳到EQAULZ
JNS DOWNZ ;小于则跳到DOWNZ
JS UPZ ;大于则跳到UPZ
EQAULZ:
INC EQUA
DEC COUNT ;计数器
CMP COUNT,1H ;等于1就退出
JNS START
JZ EXIT
UPZ:
INC UP
DEC COUNT
CMP COUNT,1H
JNS START
JZ EXIT
DOWNZ:
INC DOWN
DEC COUNT
CMP COUNT,1H
JNS START
JZ EXIT
EXIT: MOV DX,OFFSET UPSTRING ;调用中断在屏幕上显示出结果
MOV AH,09H
INT 21H
MOV BL,UP
MOV BH,30H
ADD BL,BH
MOV DL,BL
MOV AH,02H
INT 21H
MOV DX,OFFSET DOWNSTRING
MOV AH,09H
INT 21H
MOV BL,DOWN
MOV BH,30H
ADD BL,BH
MOV DL,BL
MOV AH,02H
INT 21H
MOV DX,OFFSET EQUASTRING
MOV AH,09H
INT 21H
MOV BL,EQUA
MOV BH,30H
ADD BL,BH
MOV DL,BL
MOV AH,02H
INT 21H
MOV AX,4C00H
INT 21H
END START
我最后的结果是正确的,可是只要改动31H,21H,42H,52H,87H,23H,98H,01H的前两个数屈据,马上就会出问题(改后面6个数据却不会)