2011-07-17 14 views
4

私は自分自身でx86のアセンブリをtheseビデオチュートリアルからlinuxで教え始めました。早い段階で、write sys-callを使用してデータセクションに格納されている文字列を出力する方法を教えてくれます。 writeシステムコールを使用して、スタックに格納されている文字列を出力することは可能ですか?ここでは、私が試してこれを行うために書いたコードは動作していないようです。スタック上の文字列を使用したLinux write sys呼び出し

.data 
abc: 
    .asciz "ABC" 
.text 
    .globl _start 

_start: 
    pushq %rbp 
    movq %rsp, %rbp 
    subq $32, %rsp 
    leaq -32(%rbp), %rdi 
    movb $65, (%rdi)  #move 'A' on to stack 
    addq $1, %rdi   
    movb $66, (%rdi)  #move 'B' on to stack 
    addq $1, %rdi 
    movb $67, (%rdi)  #move 'C' on to stack 
    addq $1, %rdi 
    movb $0, (%rdi)   #Null terminate 

    movq $4, %rax   #4 is write syscall 
    movq $1, %rbx   #1 for stdout 
    movq %rsp, %rcx   #pointer to ABC string on stack 
    movq $3, %rdx   #length of string 
    int $0x80 

    movq $1, %rax   #exit syscall 
    xorq %rbx, %rbx 
    int $0x80 

このプログラムは、ABCを印刷せずに実行され、終了しますが、データセグメントに格納された文字列を渡すと、ABCが印刷されます。私は間違ったことをやっているのですか?そうではありませんか?どんな助けにも感謝しています。

+0

最初のpushqを除いて、このコードはスタックポインタを変更することはできません... 'subq $ 32、%rsp'を意味しましたか、何か不足していますか? – Nemo

+0

@ニモ私はええ、私のポストのちょうどタイプミスです。私は元のコードで正しく行います。ありがとうございました –

+0

私はそれを変更しました。 :) –

答えて

4

あなたのシステムコールの数字はわかりません。

movqと "r"レジスタを使用しているので、x86-64で試していると思います。 /usr/include/asm/unistd_64.hを見てみると、私は次のように見ることができます:

#define __NR_write        1 
#define __NR_stat        4 
#define __NR_exit        60 

strace私と一緒に同意する:

$ strace ./abc 
execve("./abc", ["./abc"], [/* 43 vars */]) = 0 
stat("", NULL)       = -1 EFAULT (Bad address) 
write(-1698988341, NULL, 3 <unfinished ... exit status 0> 

注パラメータは道もオフであることを。残りのパラメータについても間違ったレジスタを使用しています。 x86-64、AFAIKの呼び出し規約では、次のレジスタを次の順序で使用します。rdi,rsirdxr10r8r9

おそらく、i386上で行われているようにsyscallsを実行しようとしていて、それが同じであると予想していますか?

+0

関連する質問:http://stackoverflow.com/questions/2535989/what-are-the-calling-conventions-for-unix-linux-system-calls-on-x86-64 – CesarB

+0

'int $ 0x80' isn x86-64上のsyscallゲートはどちらですか... – bdonlan

+0

別の関連する質問:http://stackoverflow.com/questions/1204026/syscall-from-inline-asm-in-x86-64-linux – CesarB

関連する問題