2017-04-08 16 views
0

文字列を出力するCプログラムを呼び出す簡単なx64プログラムを作成しています。X64アセンブリ:シグナルSIGBUSで終了(アドレス不一致エラー)

.data 

hello_world: .asciz "hello world!\n" 

.globl _print_string 
.globl _main 

_main: 

    pushq %rbp 
    movq %rsp, %rbp 
    leaq hello_world(%rip), %rdi 
    callq _print_string 

    movq %rbp, %rsp 
    popq %rbp 

Cプログラム:私は、Mac OS X

X64を使用しています

#include <stdio.h> 

void 
print_string(char *str) 
{ 
    printf("%s\n", str); 
} 

しかし、なぜ私はを取得シグナルSIGBUS(不整列アドレスエラー)で終了し './output' しています。誰でも私に説明してもらえますか?

答えて

2

.sファイルの最初の行はデータセグメントに切り替わり、決して元に戻りません。これにより、実行可能ではないデータセグメントにmain機能が残ります。

コードを書き始める前に、.textを使用してテキストセグメントに切り替えます。 (またはデータセグメントに切り替えて、mainの後に文字列定数を定義してください)

関連する問題