0

我编写代码来计算字符串中每个字符的频率,数组的索引是从 0 到 255,它们是 ascii 索引,值是字符出现的频率。

我比较字符串中的每个字符,每次在数组中添加 1。

但是我找不到计数似乎不对(太大)的错误?

结果应该是在此处输入图像描述

但我的结果计数太大。

错误出现在 L1 循环中,我不知道为什么循环会导致非常大的数字。

请给我一些指导,我做错了什么。

感谢您的阅读。

INCLUDE Irvine32.inc

.data
    testString BYTE "AAEBDCFBBC",0 
    freqTable DWORD 256 DUP(0)
    prompt BYTE 0Dh, 0Ah, 0
    prompt1 BYTE ": ", 0
.code   


Freq PROC uses edi,
        tString:PTR BYTE, 
        fTable:PTR DWORD

    mov eax,0
    CLD

    mov edi,fTable  
    mov ecx,256
    rep stosd;initialize fTable 0


    mov edi,fTable;reset edi position
    mov edx,tString
    mov ecx,SIZEOF tString;element number
    dec ecx;remove null character

    L1:
    mov al,[edx]  ;character value
    inc edx     ;index ++
    inc dword ptr[edi+eax] ;value ++
        Loop L1
    ret
Freq ENDP


main PROC
main ENDP
    INVOKE Freq, ADDR testString, ADDR freqTable
    mov ecx, 256
    mov ebx, 0
    mov edi,OFFSET freqTable
    mov eax, 0

    L1:
        call WriteHex;index
        mov  edx,OFFSET prompt1
        call WriteString;": "

        mov ebx, [edi + eax]
        xchg eax,ebx
        call WriteInt
        xchg eax,ebx
        mov  edx,OFFSET prompt
        call WriteString;endline
        inc eax;index ++
        Loop L1
        ;ret
END main
4

1 回答 1

1

乍一看,您的代码似乎是正确的。我发现这行mov ecx,SIZEOF tString有点可疑,请确保它返回字符串的大小 - 我担心它只是返回指针的大小。(但这应该使计数减少而不是更多。)

此外,在写循环期间,请确保您调用的各种函数不会更改您所依赖的任何寄存器,尤其eax是处于危险之中。

否则,您应该使用调试器检查生成的结果是否正确,以便判断是Freq函数还是打印循环有问题。发现这一点后,您应该逐步检查该部分以查看哪里出错了。

更新

freqTable显然由双字(每个 4 字节)组成,但您的索引使用 1 字节单位。您必须在计数循环中更改inc dword ptr[edi+eax]into ,在打印循环中也必须更改into 。inc dword ptr[edi+eax*4]mov ebx, [edi + eax]mov ebx, [edi + eax*4]

于 2013-05-09T21:20:16.853 回答