2

アセンブラで簡単なプログラムを作ろうとしているのですが、なぜかわからなくてエラーが出てしまいます。私は 64 ビット マシンで Ubuntu 12.04 を実行しており、アセンブリ コンパイラとして "as" を使用しています。私の目標は、文字列「Hello」を画面に表示することだけです。

私はこれを書きました:

#print.s
.section .data
.globl StringToPrint

 StringToPrint: .asciz "Hello"

 .globl _start

  _start:       
    movq $4, %rax
    movq $1, %rbx
    movq $StringToPrint, %rcx
    movq $5, %rdx
    int $0x80
 _done:    
    ret

しかし、それは私が得るものです:

$ as print.s -o print.o
$ ld print.o -o print
$ ./print
Hello[1]    10679 segmentation fault (core dumped)  ./print

なぜこれが起こると思いますか?何か案が?

4

2 に答える 2

2

呼び出し規則は、Linux やその他の OS の 32 ビット アプリケーションと 64 ビット アプリケーションでは異なります。さらに、Linux の場合、システム コール番号も異なります。これはwrite、Linux amd64 でシステム コールを呼び出す方法です。

; sys_write(stdout, message, length)

mov    rax, 1        ; sys_write
mov    rdi, 1        ; stdout
mov    rsi, message  ; message address
mov    rdx, length   ; message string length
syscall

さらに、アプリケーションは をsys_exit使用して戻るのではなく、終了するために呼び出す必要がありますret。プラットフォームの呼び出し規約を読んでください。

于 2013-08-29T15:21:56.327 に答える