次のプログラムを実行しようとしました。
C コード :
int main()
{
char *s1 = "hello";
printf("string : %s\n", strchr(s1, 'l'));
}
アセンブリ コード:
global strchr
section .text
strchr:
push rbp
mov rbp, rsp
strchr_loop:
mov al, byte [rsi] ; My bug come from here
cmp byte [rdi], al ; and from here
je strchr_end
cmp byte[rdi], 0
jz strchr_nul
inc rdi
jmp strchr_loop
strchr_end:
mov rax, rdi
mov rsp, rbp
pop rbp
ret
strchr_nul:
mov rax, 0
mov rsp, rbp
pop rbp
ret
これを実行すると、セグメンテーション違反が発生しました。
しかし、バグ行を使用する代わりに値「l」に置き換えると、プログラムは機能しています
cmp byte [rdi], 'l' ; It's working