注册 登录
编程论坛 汇编论坛

存储器中有N字数组Array,统计其中正数,负数和零的个数,并分别存放在DI,SI,AX寄存器中的程序,有点问题,望高手指教!谢谢!

紫色年华 发布于 2012-11-30 19:26, 967 次点击
这是我自己写的一个在存储器中有N字数组Array,统计其中正数,负数和零的个数,并分别存放在DI,SI,AX寄存器中的程序,程序倒是可以运行,但运行结果有问题,希望大家可以帮我看一下!

data segment
    Array DW -1,3,0,1,-4,2,0,-5,6,8
    Zhengshu DW ?
    Fushu DW ?
    Ling DW ?
   
    pkey db "press any key...$"
ends

stack segment
    dw   128  dup(0)
ends

code segment  

start:
    mov ax, data
    mov ds, ax
    mov es, ax
   
    XOR DI,DI     
    XOR SI,SI         
    XOR AX,AX
    LEA BX,Array

LOP:
    MOV AL,[BX]                       
    CMP AL,00H
    JZ  END3
    JA  END2
   
    INC SI
    ADD Fushu,SI
    ADD BX,Array
    JMP LOP

END2:         
    INC DI
    ADD Zhengshu,DI
    ADD BX,Array
    JMP LOP

END3:         
    INC AX
    ADD Ling,AX
    ADD BX,Array   
    JMP LOP  
            
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
   
    ; wait for any key....   
    mov ah, 1
    int 21h
   
    mov ax, 4c00h ; exit to operating system.
    int 21h   
ends

end start ; set entry point and stop the assembler.
6 回复
#2
有容就大2012-11-30 21:26
如果你调试过 至少要描述下有什么问题吧
#3
紫色年华2012-12-01 09:50
对于这个程序,我想的是
    MOV AL,[BX]  ;把数组的第一个位赋给AL                     
    CMP AL,00H   ;比较AL和0的大小
    JZ  END3     ;如果AL-0是0(AL等于0),跳到END3,统计0的个数
    JA  END2     ;如果AL-0>0(AL>0),跳到END2,统计正数的个数
否则的话,执行下面这段程序,是统计负数的个数   
    INC SI
    ADD Fushu,SI
    ADD BX,Array  ;我想的是取数组里面的下一个值,不知道对不
    JMP LOP
    运行的结果是对正数的统计结果是1个,对负数的统计结果总是显示0,对零的统计结果在不断增加,是个死循环,我也是刚开始学汇编,不知道统计个数的那三小段程序有没有问题。
#4
有容就大2012-12-01 22:19
帮你改了 加了个比较结束标志数(9527) 就是数组末尾加的那个 缺点的9527不能做为正数中的一员了
不过只是个演示 也没关系
程序代码:
;#Mode=DOS

ASSUME CS:CODE,ds:data
data segment
    Array DW -1,3,0,1,-4,2,0,-5,6,8, 9527
    Zhengshu DW 0
    Fushu DW 0
    Ling DW 0
    pkey db "press any key...$"
data ends

stack segment
    dw   128  dup(0)
stack ends

code segment
start:
    mov ax, data
    mov ds, ax
    mov es, ax  

    XOR DI,DI   
    XOR SI,SI      
    XOR AX,AX
    LEA BX,Array
LOP:
    MOV DX,[BX]                     
    CMP DX,00H
    JZ  END3
    JG  END2  

    ADD Fushu,1
    ADD BX,2
    JMP LOP

END2:   
    CMP DX, 9527
    JZ    OK
    ADD Zhengshu,1
    ADD BX,2
    JMP LOP
END3:         
    ADD Ling,1
    ADD BX,2
    JMP LOP
OK: MOV    DI, Zhengshu
    MOV SI, Fushu
    MOV AX, Ling
    lea dx, pkey
    mov ah, 9
    int 21h        ; output string at ds:dx
    ; wait for any key....
    mov ah, 1
    int 21h
    mov ax, 4c00h ; exit to operating system.
    int 21h
code ends
end start
程序要写规范点哦
只有本站会员才能查看附件,请 登录

#5
紫色年华2012-12-02 10:33
嘿嘿,我初次学汇编,可能写程序有点不规范,不过我会努力的!谢谢你!
我还想问一下,那个比较结束标志数是不是随便选个大点的数就行呀,我试了一下结果是对的
#6
有容就大2012-12-02 14:54
回复 5楼 紫色年华
你的程序用的jmp指令 所以设个结束标志 这个由你选只要在AX表示数的范围内就行
如果用loop指令 就没必要设什么循环结束标志了 。
#7
紫色年华2012-12-02 20:38
知道了,谢谢!
1