2011-05-01 6 views
1

utf-8 텍스트의 주어진 위치에 문자를 반환하는 어셈블리 함수를 작성하려고합니다.조립 : get utf8 char 함수 도움말

많은 솔루션을 시도했지만 제대로 작동하지 않습니다. 이것은 내가 지금까지 가지고있는 것입니다 :

.globl utf8_get 
    .globl _utf8_get 
utf8_get: 
_utf8_get: 
     pushl %ebp 
     movl %esp, %ebp 
     movl 4(%ebp), %eax 
     movl 12(%ebp), %ecx 

u_loop: cmpb $0x0, (%eax) 
     jz  n_fnd 
     incl %eax 
     cmpl $0x0, %ecx 
     jz  fnd 
     decl %ecx 
     jmp  u_loop 

n_fnd: movl $-0x1, %eax 
     popl %ebp 
     ret 

fnd: movzbl (%eax), %eax 
     popl %ebp 
     ret 

매개 변수는 unsigned char * 및 int입니다.

그러나 올바른 문자를 반환하지 않습니다. 반환 주소를 포함하지 4(%ebp)을, -

답변

0
  1. 가장 큰 문제는 인수가 8(%ebp)에서 발견된다는 점이다.
  2. 나는 을 확인한 후에 %eax을 증가 시키려고한다고 생각합니다.
  3. 실제로 UTF-8을 의미합니까? UTF-8 멀티 바이트 문자 인코딩입니다 : UTF-8 문자 반드시 N 바이트하지 않은 N일 (공정한 조금 더 많은 노력이 문자를 계산하고 일을 '해독하는 데 필요합니다 관심이 다시).
+0

필자가 작성한대로 char가 아닌 n 번째 바이트를 반환한다고 가정합니다 ... 몇 가지 변경을 시도했는데 결과가 거의 맞습니다. 하지만 내가 전에 wan't, 하나의 바이트를 얻을 ... – Cryptography

+0

나는 첫 번째 인수가 4 (% ebp)에서 발견하고 0 (% ebp) 또는 그냥 (% ebp)에서 반송 주소라고 생각. – Cryptography

+0

*'utf8_get'에 대한 엔트리에서 리턴 주소는'(% esp)'이고 첫 번째 인수는'4 (% esp)'입니다. 그러나 프롤로그'pushl % ebp; movl % esp, % ebp'는 스택 포인터를 푸시에서 4 바이트 씩 감소시키고 복사하기 전에 - 오래된'% ebp'가'(% ebp)'에 있으면 리턴 주소는'4 (% ebp)'이고 첫 번째 인수는'8 (% ebp)'입니다. –