先週のラボでは、x86_64 アセンブリに strlen 関数を実装する必要がありました。ラボを終了して満点を取得しましたが、後でコードに誤りがあることに気付きました。長い文字列の場合は正常に機能しますが、長さが 1、2、3、または 4 の文字列の場合、関数は 6 を返します。理由がわかりません。以下はコードです。
。文章 .globl mystrlen .type mystrlen、@関数 ミストレン: movq $0, %rax #リターンレジスタに 0 を入れる movq $0、%r15 開始ループ: cmpq $0, (%rdi) #while n!=0 終わり incq %rax incq %rdi movq $0、%r14 cmpq $0, %r14 #最初に戻る je beginloop 終わり: # ret # 結果を返す;
これは strlen を実装する良い方法ではないことがわかりました。これを効率的にするために利用できるものがありますが、あまり気にしません。このコードが長さ 1、2、3、または 4 の文字列に対して 6 を返す理由を理解しようとしています。長さ 0 または 5 を超える文字列に対して正しく返されます。理解してください。