回 帖 发 新 帖 刷新版面

主题:[讨论]哪个高手进来帮忙看下啊...急~~~后天就要给老师检查了.万分感谢!

小弟是新手,望各位大哥不吝赐教.原题是这样的:编写一个有主程序和子程序结构的程序模块.子程序的参数是一个N字节数组的首地址TABLE,数N及字符CHAR.要求在N字节数组中查找字符CHAR,并记录该字符出现的次数.主程序则要求从键盘接受一串字符以建立字节数组TABLE,并逐个显示从键盘输入的每个字符CHAR以及它在TABLE数组中出现的次数.(为简化起见,假设出现次数<16,可以用十六进制形式把它显示出来.)
下面是偶编的一个程序,可是在显示次数时总是出现乱码,不知道为什么,下面附上原程序:
;****************************************************
data segment
    
     table db 30,0,30 dup(?)
    
data ends
;****************************************************
extra segment

     table2 db 30 dup(?)

extra ends
;****************************************************

code segment
;----------------------------------------------------
main proc far
        assume cs:code,ds:data,es:extra
start:
        mov ax,data
        mov ds,ax

        mov ax,extra
        mov es,ax


               lea dx,table                     ;read string
               mov ah,0ah
               int 21h
       
               sub ch,ch                        ;cx<=character number
               mov cl,table+1
               mov si,offset table               ;make si point the string
               add si,2

               push si
               push cx

               lea di,table2
               cld
               rep movsb

               pop si
               pop cx

dispchar:      sub dx,dx 
              mov dl,[si]                        ;output char
              mov ah,2
              int 21h
              
              
              mov al,dl
              call search_a
              
           
              mov dl,20h                           ;output space
              mov ah,2
              int 21h
              
              add bx,30h
              mov dl,bl
              mov ah,2
              int21h
                           
             

                      
              mov dl,20h                           ;output space
              mov ah,2
              int 21h

              inc si  
      
     

      loop dispchar

      mov ax,4c00h
      int 21h

main endp
;----------------------------------------------------
search_a proc near
              push cx
              push si
              
              
                lea di,table2
                
                mov bx,0
                mov ch,0
                mov cl,table+1
                cld
            
comps:       repnz scasb
             
              jnz   exit                          ;没找到退出
        
          inc bx                                        ;否则,记数器加1
        
              sub dx,dx                           ;置零标志为0
         loop comps                          ;循环记数

exit:             
                  pop  si
                  pop  cx
       ret
search_a endp
;------------------------------------------------------

code ends
;******************************************************
     end start

回复列表 (共2个回复)

沙发

我试过了,没有问题的.(有个INT21H没加空格)
你可以尝试一下在输出前再取一下地址放入寄存器看看,我在AMD CPU的机器上也遇到过此类问题,就是用这种方法解决的

板凳


请问你运行结果是什么?可以贴上来给我看一下么?我的机恰好也是AMD CPU的,但是我每次运行显示bx都得不到正确的结果.就是在次数小于10的情况下也输不出正确的数字.

编译好象没有错误,但是我那个计数的子程序我怎么都检查不出错误,怎么显示就有了问题了呢?

谢谢!!!!

我来回复

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