私は簡単な例と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 LTS
をintel core i5
の下で使用しています。
にも参照してください。 –
'strace'の下でプログラムを実行すると、システムコールのargsと戻り値をデコードします。その他のasmデバッグのヒントについては、https://stackoverflow.com/tags/x86/infoの下部を参照してください。 –