2017-12-24 54 views
1

私は簡単な例とgdbを使ってアセンブリプログラミングとエクスペレーティングを始めました。なぜセグメント化エラーが発生しませんでしたか?

1.asm

section .text 
    global _start 
    extern _print_func 

_start: 
    push str 
    movzx rdx, byte [str_len] 
    push dx ; <--- typo here, should be rdx 
    call _print_func 

    mov rax, 60 
    syscall 

section .data 
    str: db 'Some data',0x0A,0x0D 
    str_len: db $ - str 

2.asm

section .text 
    global _print_func 

_print_func: 
    pop rbx 
    pop rdx 
    pop rsi 
    mov rax, 0x01 
    mov rdi, 0x01 
    syscall 
    push rbx 
    ret 

section .data 
    str: db 'Some string',0x0A,0x0D 
    str_len: db $ - str 

ldで)リンク、コンパイルとそれだけで何も印刷されていないプログラムを実行した後:ここで私が書いたプログラムです。そこで、syscallの前にレジスタの内容を調べました。

(gdb) info registers 
rax   0x1  1 
rbx   0x4000c5 4194501 
rcx   0x0  0 
rdx   0x6000e4000b  412331802635 ; <-- obviously wrong 
rsi   0x10000 65536 
rdi   0x1  1 
rbp   0x0  0x0 
rsp   0x7fffffffdcc6 0x7fffffffdcc6 

ので、システムコールは、プログラムのすべてのバイトにアクセスすることを許可されていないので、私はセグメンテーションフォールトを引き起こしているはずと思っ0x10000から始まる412331802635バイトを読んでみてください。

しかし、それは黙って何も印刷されません。どうして?なぜSegmantation Faultが起きなかったのですか?それは何らかの不確定な振る舞いでしたか?私はUbuntu 16.04 LTSintel core i5の下で使用しています。

+1

にも参照してください。 –

+0

'strace'の下でプログラムを実行すると、システムコールのargsと戻り値をデコードします。その他のasmデバッグのヒントについては、https://stackoverflow.com/tags/x86/infoの下部を参照してください。 –

答えて

4

sys_writeは、セグメンテーションを発生させず、エラーコードを返します。 syscallの終了後にraxに表示されます。それがエラーを返し、セグメンテーション違反が発生することはありませんread` `man 2 write

+0

ちょうど試して、 'rax 0xfffffffffffffff2 -14'を手に入れました。今理解して、多くのおかげで。 –