2016-08-31 6 views
1

シンプルなASMプログラムを作成しましたが、sys_writeは出力を出していません。私は%ecxへのポインタで間違いを犯したと思うし、sys_writeは文字列にアクセスすることができませんが、これまでのところ間違いはありません。"Hello World" - サンプルがたくさんありますが、私が間違っていることを理解したいと思っています。他の作業コードがあります:-)
接頭辞付きのIntel構文を使用します。 gdbの出力は次のようになります。GNUアセンブラsys_writeが機能しません

 
gdb ./testsasm 
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1 
... 
Reading symbols from ./testsasm...done. 
(gdb) break main 
Breakpoint 1 at 0x4004d6: file t.asm, line 13. 
(gdb) n 
The program is not being run. 
(gdb) run 
Starting program: ...src/gnu_asm/testsasm 

Breakpoint 1, main() at t.asm:13 
13   mov %ebx,0x1   # file handle stdout 
(gdb) n 
14   mov %eax,0x4   # systemcall sys_write 
(gdb) n 
15   mov %ecx,string   # pointer of the string const 
(gdb) n 
16   mov %edx,slen   # string lenght 
(gdb) n 
17   int 0x80    # call write 
(gdb) print $ecx 
$1 = 1819043144 
(gdb) print $edx 
$2 = 7 
(gdb) print *$ecx 
Cannot access memory at address 0x6c6c6548 
(gdb) 

Makefileとソースがここで見つけることができます:奇妙なhttp://paste.ubuntu.com/23115239

答えて

1

は、誰もがそうあなたがレジスタ名に%秒を必要としない(.intel_syntax noprefixなし.intel_syntaxを使用していません、および即時に$)。

質問には間違いなくそれを含める必要があります。 (更新:ああ、そうしましたが、段落のテキストに埋もれているだけで、gdbの出力に何が入っていたかのようでした)。私はあなたが完全なアドレス1 segfaulting(mov %ebx, 0x1に入るでしょう&の構文モード)に店舗について何も言わなかったので、あなたが完全なソースリンクを見たときに気づいただけです。


mov %ecx,string ECXstringからロードします。 .intel_syntax noprefixでは、即時定数としてアドレスを取得するにはmov ecx, OFFSET stringが必要です。 intel_syntax "接頭辞" モードでは、あなたはおそらくmov %ecx, $stringmov r32, imm32


はあなたの~/.gdbinitでこれを入れて取得することができます。SYS_WRITE後

set disassembly-flavor intel 
layout reg 

リターンコードは、%eaxレジスタに格納されており、少ない0

それは、悪いアドレスを渡すために-EFAULTでなければなりません。

+0

ありがとうございます! "OFFSET文字列"は正確なヘルプでした。 – 0x0C4

関連する問題