アセンブリレベルでsyscallを実行するときにas
がnasm
と異なる動作をする理由を理解しようとしています。私は処罰の大食主なので、私はIntel構文を使用しています。私はld -s -o prog prog.o
とas -o prog.o prog.s
とリンクして組み立てGNUアセンブラを使ってsyscallを実行するときのSegfault
.intel_syntax noprefix
.section .rodata
.LC0:
.string "Hello world!\n"
.text
.globl _start
.type _start, @function
_start:
mov edx, 13
mov ecx, OFFSET FLAT:.LC0
mov eax, 4
int 0x80
ret
:ここに私のプログラムです。
しかし、私はそれを実行したときに、私が取得:
$ ./prog
Hello world!
Segmentation fault (core dumped)
GDBは、ここでは特に有用ではありません。 stepi
がret
の場合、Cannot access memory at address 0x1
と表示されます。 ESP
の値であるため、不可解である:
(gdb) info registers esp
info registers esp
esp 0xbffff660 0xbffff660
なぜ、このプログラムセグメンテーション違反していますか?
プログラムから 'ret'するだけでは、' exit'システムコールが必要です。 '1'はスタックの先頭にある引数(' argc')の数なので、 'ret'は明示的な結果を持つアドレスとしてそれを使用しようとします。 – Jester