回 帖 发 新 帖 刷新版面

主题:这个有关数组的程序错在哪里?

首先,看完代码后也请不要骂我,我们那个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个数据却不会)

回复列表 (共5个回复)

沙发

JNS和JS 是处理有符号数,
此题处理无符号数 
应使用 JA (大于)和 JB(小于)

板凳

不太明白,改动31h,21h就会有错误吗?程序段没有错误呀,用debug调试一下

3 楼

看着太费神,我从写了一下 中间的计算部分


.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
;-开始
    lea bx,data1
    mov si,0
    mov cx,8
    mov al,search
@start:
    cmp [bx+si],al
    ja @up
    jb @down
    inc equa
    jmp @end
@up:
    inc up
    jmp @end
@down:
    inc down
    jmp @end
@end:    
    inc si
    loop @start
;-结束


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

4 楼

谢谢ccpp,这样改了就成功了

5 楼

不过好象还要把[DATA1+BX]再减去1

我来回复

您尚未登录,请登录后再回复。点此登录或注册