0

文字列の長さを取得するためのコードを Stack Overflow で見つけました。コードは次のとおりです。

HELLO_MSG: db 'Hello, world!', 0
mov ebx, HELLO_MSG
call print_string

print_string:
 call str_len
 mov ecx, eax ; puts the length of the called string into ecx register
 cdq          ; clear the direction flag; not sure if this is needed
 mov ah, 0x0e ; scrolling teleype BIOS routine

 printing:
    mov al, byte bl
    int 0x10
    inc ebx
    loop printing

 ret
str_len:
 mov eax,ebx

 l00p:
    cmp byte[eax], 0
    jz lpend
    inc eax
    jmp l00p
 lpend:
    sub eax, ebx ; puts the length of the string into eax register

    ret

問題は、関数が を呼び出すとstr_len、ループが 3 回しかなく、2 回ループすることもあります。印刷すると、実際の文字列ではなく、ランダムな文字が印刷されます。なぜ機能しないのか誰か知っていますか?ブート セクタで実行しようとしているので、実際にはデバッグ ツールがありません。

4

1 に答える 1