2013-05-09 2 views
0

나는 문자열의 빈도로 각 문자를 컴퓨터에 작성하고 인덱스는 0에서 255까지이며 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는 분명히 개의 dword까지 (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];에오고, 값 ++는 틀린 것처럼 보였다. 내가 고칠 수있게 도와 줄 수 있니? –

+0

'inc dword ptr [edi + eax * 4]'는 나에게 잘 어울립니다. 'edi'를로드 할 때'offset'이 필요합니까? –

관련 문제