2012-03-03 2 views
1

다음과 같은 어셈블리 함수를 C에서 호출하여 null로 끝나는 문자열의 길이를 계산했습니다. 그러나 어떤 이유로 카운트는 항상 +1로 해제됩니다. 나는 이유를 알 수 없다. 어떤 단서?strlen을 1 씩 해제 하시겠습니까?

감사합니다 !!!

보십시오 캐릭터 카운터 ( eax), 예를 들어 빈 문자열을을 증가하기 전에 제로 ( cmpb $0x0, %dl)와 현재의 문자를 비교,이 문자열 1을 반환합니다 함수는 카운터가 있는지 확인하기 전에 증가하기 때문에
1 .text 
2 .globl _len 
3 _len: 
4   pushl %ebp    # set up stack frame 
5   movl %esp, %ebp   # save esp in ebp 
6   movl 8(%ebp), %ecx  # the beg of string 
7   xor %eax, %eax   # init length to 0 
8   
9 start: 
10   xor %edx, %edx   # char at this index 
11   movb (%ecx), %dl  # 
12   inc %eax 
13   inc %ecx 
14 
15   cmpb $0x0, %dl 
16   jne start 
17 end: 
18 
19   movl %ebp, %esp   # restore esp 
20   popl %ebp    # restore ebp 
21   ret 
22   .end 
23 
+1

다르게 사용되는 용어로 인해 발생하는 문제를 피하기 위해 "항상 +1로 +1 함"을 의미합니까? N 개의 문자가 포함 된 문자열이 있고 그 다음에 NULL이 생기고 마지막에 N + 1이 생깁니다. – karatedog

+0

오른쪽 !!!!!! 이 카운트가 NULL 문자를 실제로 차지한다는 사실을 잊어 버렸습니다! 감사합니다. – user113454

+2

'xor % edx, % edx'는 함수에서 아무런 목적이 없다는 것에 유의하십시오. –

답변

2

끝나는 0 문자를 계산 중입니다. 비교 후 -1 또는 증가로 시작하십시오.

1

유효 할 수있는 문자가 있습니다.

관련 문제