1. ホーム
  2. linux

[解決済み] アセンブリの制約

2022-02-14 05:54:16

質問

strlenの実装をアセンブリで自作したが、正しい値を返さない。文字列の長さ+4が返される。その結果 理由がわからない...誰かわかる人がいればいいのだが...
アセンブリのソースです。

section .text
    [GLOBAL stringlen:] ; C function

stringlen:  
    push ebp
    mov ebp, esp        ; setup the stack frame

    mov ecx, [ebp+8]

    xor eax, eax        ; loop counter


startLoop:
    xor edx, edx
    mov edx, [ecx+eax]
    inc eax

    cmp edx, 0x0 ; null byte    
    jne startLoop
end:    
    pop ebp

    ret

そして、メインルーチン。

#include <stdio.h>

extern int stringlen(char *);

int main(void)
{
  printf("%d", stringlen("h"));

  return 0;
}

ありがとうございます。

解決方法は?

バイト(文字)ではなく、ダブルワードにアクセスしています。ですから、このコードでは終端のゼロを1つだけ探しているのではなく、連続した4つのゼロを探しているのです。文字列の後のメモリに何が含まれているかによって、常に正しい値+4が返されるとは限らないことに注意してください。

修正するには、バイトアクセスを使用する必要があります。 edx から dl .