2

アセンブリプログラミングに不慣れで、画面に文字を印刷するのに問題があります。プログラムを実行するたびにセグメンテーション違反が発生し、その理由がわかりません。

.section .data
  A:
    .long  65  # ascii code for 'A'

.section .text
.globl _start

_start:
 movl $1, %edx # length of character to print, 1
 movl  A, %ecx # what I want printed
 movl $1, %ebx # file descriptor for STDOUT
 movl $4, %eax # syscall number for sys_write

 int $0x80     # calls kernel

 movl $0, %ebx # return status
 movl $1, %eax # syscall number for sys_exit

 int $0x80     # calls kernel

これらは私がビルドするために使用するコマンドです (私のファイルの名前はwrite.sです)

as write.s -o write.o
ld write.o -o write

これは文字を印刷する正しい方法ではありませんか?どんな助けでもいただければ幸いです。

4

1 に答える 1

2
movl A, %ecx

意味:ラベルAのアドレスの値をにコピーします%ecx。正しい手順は次のとおりです。

movl $A, %ecx

また

leal A, %ecx

-gこのような場合、デバッグにGDBを使用できます(デバッグ情報を取得するには、フラグを使用してアセンブルする必要があることに注意してください)。

$ as -g write.s -o write.o
$ ld write.o -o write
$ gdb write
GNU gdb (GDB) 7.5
   [.. snip ..]
(gdb) b test.s:13
Breakpoint 1 at 0x4000c6: file test.s, line 13.
(gdb) run
Starting program: /home/niklas/tmp/asm/write 

Breakpoint 1, _start () at test.s:13
13   int $0x80     # calls kernel
(gdb) info registers ecx
ecx            0x41 65

ご覧のとおり%ecx、整数値があります65が、これは必要な値ではありません。


を実行するstrace ./writeと、システムコール引数と戻り値がデコードされます。悪いポインタを渡すと、何もせずwrite()に戻ってくることがわかります。-EFAULT

于 2012-08-31T18:20:38.900 に答える