1

私自身の楽しみのために、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 -nostdlibGNU アセンブラを呼び出している でアセンブルしています。

クラッシュ後にレジスタをダンプすると、次のことが明らかになります。

  • %rsi文字列への期待されるポインタが含まれています
  • %al文字列の予想される最初の文字を含む
  • %ripメモリに触れない命令を指している

通常の呼び出し規則がないことは無視してください。syscall インターフェース以外には何も呼び出していません。これは、そこまで到達する前にクラッシュします。

4

1 に答える 1

5

'A'結局のところ、アドレスとして解釈されています。定数として使用する場合は、次のように記述する必要があります。

cmp $'A', %al
于 2012-06-02T11:44:44.630 に答える