私自身の楽しみのために、Linux 用の x86_64 アセンブリで小さなプログラムを作成しています。ただし、即値オペランドをレジスタと比較する命令で、まったく意味のない segfault に遭遇しました。何を与える?
クラッシュに至るまでのコードは次のとおりです。
_start:
sub $8, %rsp
mov %rsp, %rbx
lea le_string(%rip), %rsi
mov %rsi, %rdi
add $8, %rdi
mov $26, %cl
mov (%rsi), %al
cmp 'A', %al /* This line segfaults */
/* snip code that never runs */
le_string:
.ascii "YrFgevat"
gcc -nostdlib
GNU アセンブラを呼び出している でアセンブルしています。
クラッシュ後にレジスタをダンプすると、次のことが明らかになります。
%rsi
文字列への期待されるポインタが含まれています%al
文字列の予想される最初の文字を含む%rip
メモリに触れない命令を指している
通常の呼び出し規則がないことは無視してください。syscall インターフェース以外には何も呼び出していません。これは、そこまで到達する前にクラッシュします。