2011-05-01 49 views
1

嘗試編寫一個彙編函數,該函數返回utf-8文本中給定位置的字符。彙編:獲取utf8字符函數的幫助

我已經嘗試了很多解決方案,但我無法使它正常工作。這是我到目前爲止:

.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 

參數是無符號char *和int。

但它不返回正確的字符。

回答

0
  1. 最大的問題是,第一個參數被發現在8(%ebp) - 不4(%ebp),它包含返回地址。
  2. 我想你想在檢查%ecx之後增加%eax,而不是之前。
  3. 你真的指的是UTF-8嗎? UTF-8是一個多字節字符編碼:ñ UTF-8 字符不一定是ñ字節(更公平一點需要努力計算字符數和解碼一個你」重新感興趣)。
+0

我應該返回第n個字節,而不是像我寫的字符一樣......我嘗試做出一些更改,結果幾乎是正確的。但我得到的字節在我想要的那個之前,似乎... – Cryptography 2011-05-01 18:46:34

+0

我認爲第一個參數是在4(%ebp)找到的,而返回地址是0(%ebp)或者只是(%ebp)。 – Cryptography 2011-05-01 18:50:36

+0

*在輸入爲'utf8_get'時,返回地址在'(%esp)',第一個參數在'4(%esp)'。但是序言'pushl%ebp; movl%esp,%ebp'在複製前將堆棧指針減少4個字節 - 所以在舊的'%ebp'位於'(%ebp)'之後,返回地址爲'4( %ebp)',第一個參數是'8(%ebp)'。 – 2011-05-01 19:35:23