2013-05-09 20 views
0

我將代碼寫入計算機中每個字符的字符串頻率中,並且數組的索引爲0到255,它們是ascii索引,值是該字符出現的頻率。使用ascii索引和十進制值的頻率表

我比較字符串中的每個字符,並每次在數組中添加1。

但我找不到錯誤,計數似乎不正確(太大)?

結果應該是enter image description here

,但我的結果的數量太大。

錯誤出現在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 

回答

1

從你的代碼似乎有關的權利的第一印象。我發現行mov ecx,SIZEOF tString有點可疑,請確保返回您的字符串的大小 - 我擔心它只是返回指針的大小。 (但是這應該使計數更少。)

此外,在寫入循環期間,請確保您調用的各種函數不會更改您依賴的任何寄存器,特別是eax處於危險中。

否則,您應該使用調試器來檢查生成的結果是否正確,以便您可以判斷它是Freq函數還是您的打印循環出現故障。發現後,你應該逐步查看該部分,看看它出錯的地方。

更新

freqTable顯然是由雙字的(4個字節),但您的索引使用1字節爲單位。您必須在計數循環中將inc dword ptr[edi+eax]更改爲inc dword ptr[edi+eax*4],並且在打印循環中將mov ebx, [edi + eax]更改爲mov ebx, [edi + eax*4]

+0

我發現錯誤出現在循環'inc dword ptr [edi + eax]; value ++'似乎是錯誤的。你能幫我解決嗎? – 2013-05-09 21:45:43

+0

'inc dword ptr [edi + eax * 4]'看起來對我更好。你在加載'edi'時需要一個'offset'嗎? – 2013-05-09 22:23:51