2016-03-27 29 views
1

アセンブラで関数のパラメータとして文字列の配列を渡すにはどうすればよいですか?例えば が、私はこのようになります()関数はexecveをコールしたいと言うことができます:関数のパラメータとして文字列の配列を渡すには?

TEST.ASM

format elf executable 

entry main 

main: 
    mov eax, 11 ; execve - executes program 
    mov ebx, filename ; label name is address of string variable 
    mov ecx, args  ; label name is address of array of strings? 
    mov edx, 0   ; NULL 
    int 80h 

    mov eax, 1 ;exit 
    int 80h 
    ret 

filename db '/bin/ls', 0  ; path to program 
args db '/bin/ls', 0, '.', 0, 0 ; array should end with empty string to 
           ; indicate end of array 

メイク

all: 
    ~/apps/fasm/fasm ./test.asm 

int execve(const char *filename, char *const argv[], char *const envp[]); 

ので、私はこれを行います

私のプログラムを実行するとexecve()は要求されたプログラムを実行できず、strace ./testはこのmesを表示しますsage:

execve("/bin/ls", [0x6e69622f, 0x736c2f, 0x2e], [/* 0 vars */]) = -1 EFAULT (Bad address) 

「args」変数をexecve関数に正しく渡すにはどうすればよいですか?

ありがとうございました:)

+0

何かが行われているか調べるには、C言語で記述し、コンパイラの出力を見てください。 –

+0

'lea ebx、[filename]'を使って、ラベルのアドレスをレジスタに移動します。 – sivizius

答えて

2

これはCでどのように動作するのですか?文字列はポインタであり、文字列配列はポインタの配列です。 argsは、ポインタのサイズのアイテムを取得することddあり、そしてそれは、文字列のアドレスで満たされていることを

filename db '/bin/ls', 0 
dot db '.', 0 
args dd filename, dot, 0 

はご注意:このようにあなたのような何かをする必要があります。

関連する問題