2012-11-08 24 views
0

上週在實驗室中,我們必須在x86_64程序集中實現strlen函數。我完成了實驗並得到了全額獎勵,但後來發現我的代碼中存在錯誤。對於長字符串,它工作正常,但對於長度爲1,2,3的字符串,或4我的函數返回6.我不明白爲什麼。以下是代碼。strlen程序集返回6用於短字符串

 
    .text 
     .globl mystrlen 
    .type mystrlen, @function 
    mystrlen: 
     movq $0, %rax     #put 0 in return register 
     movq $0, %r15 
     beginloop: 
     cmpq $0, (%rdi)   #while n!=0 
     je end 
     incq %rax 
     incq %rdi 
     movq $0, %r14 
     cmpq $0, %r14     #go back to bginning 
     je beginloop 
     end:       # 
      ret      # return result; 

現在我知道這是不是實現strlen的一種好方法,有件事情我可以利用的優勢,使這種高效的,但我真的不在乎。我只是想弄清楚爲什麼這個代碼返回長度爲1,2,3或4的字符串爲6。它確實返回長度爲0或大於5的字符串。請幫我理解

+3

當你使用'cmpq $ 0,(%rdi)'時,你比較了多少個字節? –

回答

2

Bo Persson已經指出問題在哪裏。 而不是使用cmpq,你應該使用cmpb(與字節比較)