6

アセンブリで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;
}

ありがとう

4

6 に答える 6

4

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

修正するには、たとえばに変更edxして、バイトアクセスを使用する必要がありますdl

于 2011-02-18T13:24:15.983 に答える
4

回答ありがとうございます。ここで私と同じ問題を抱えている人のための作業コード。

section .text
    [GLOBAL stringlen:]

stringlen:  
    push ebp
    mov ebp, esp

    mov edx, [ebp+8]    ; the string
    xor eax, eax        ; loop counter

    jmp if

then:
    inc eax

if:
    mov cl, [edx+eax]
    cmp cl, 0x0
    jne then

end:
    pop ebp
    ret
于 2011-02-18T14:26:56.070 に答える
1

4つについてはわかりませんが、文字列から読み取られた最初のバイトがゼロであっても、常に増加するため、eax常に適切な長さ+1を返すことは明らかです。

于 2011-02-18T12:55:19.633 に答える
1

行を変更します

mov edx, [ecx+eax]

mov dl, byte [ecx+eax]

  cmp edx, 0x0 ; null byte

  cmp dl, 0x0 ; null byte

一度に1バイトだけを比較する必要があるためです。以下はコードです。元のコードが1つずつエラーになりました。「h」の場合、2つのh+null文字を返します。

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 dx, dx
    mov dl, byte [ecx+eax]
    inc eax

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

    ret
于 2011-02-18T13:25:55.730 に答える
0

ここでのより簡単な方法(ASCIIゼロで終了する文字列のみ):

REPE SCAS m8

http://pdos.csail.mit.edu/6.828/2006/readings/i386/REP.htm

于 2011-02-18T21:12:40.813 に答える
-2

私はあなたの株式会社がjneの後にあるべきだと思います。私はこのアセンブリに精通していないので、本当にわかりません。

于 2011-02-18T12:55:30.447 に答える