1

私は実験していて、プログラムが終了する直前に「セグメンテーション エラー (コア ダンプ)」メッセージが表示されることを除いて、非常にうまく機能する次のアセンブリ コードを持っています。

GLOBAL _start

%define ___STDIN 0
%define ___STDOUT 1
%define ___SYSCALL_WRITE 0x04

segment .data
segment .rodata
    L1 db "hello World", 10, 0
segment .bss
segment .text
_start:
    mov eax, ___SYSCALL_WRITE
    mov ebx, ___STDOUT
    mov ecx, L1
    mov edx, 13
    int 0x80

ret最後に持っているかどうかは問題ではありません。私はまだメッセージを受け取ります。

どうしたの?

x86 と nasm を使用しています。

4

1 に答える 1

5

最初からできませんret。これは関数ではなく、スタックに戻りアドレスがありません。スタック ポインタはargc、プロセス エントリでポイントします。

nmがコメントで述べたように、問題はプログラムを終了していないため、実行がガベージコードになり、セグメンテーション違反が発生することです。

必要なものは次のとおりです。

;; Linux 32-bit x86
%define ___SYSCALL_EXIT 1

// ... at the end of _start:
    mov eax, ___SYSCALL_EXIT
    mov ebx, 0
    int 0x80

(上記は 32 ビット コードです。64 ビット コードでは、 mov eax, 231(exit_group) /が必要ですsyscall。終了ステータスは EDI で指定します。例:

;; Linux x86-64
    xor   edi, edi     ;  or mov edi, eax    if you have a ret val in EAX
    mov   eax, 231     ; __NR_exit_group
    syscall
于 2015-06-01T19:05:52.297 に答える