2016-03-27 13 views
1

Wie kann ich Array von Strings als Parameter übergeben, um in Assembler zu funktionieren? Zum Beispiel können sagen, ich will execve() Funktion aufrufen, die wie folgt aussieht:Wie man Array von Strings als Parameter an die Funktion übergeben?

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

so dass ich dies tun:

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 

Make-Datei

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

Aber wenn ich mein Programm ausführen execve() fehlschlägt angeforderte Programm ausführen und strace ./test zeigt diese mes sage:

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

Wie "Args" Variable ordnungsgemäß übergeben, um Funktion auszuführen?

Danke :)

+0

Um herauszufinden, wie etwas gemacht wird, schreiben Sie es in C und sehen Sie sich die Compiler-Ausgabe an. –

+0

Verwenden Sie 'lea ebx, [Dateiname]', um die Adresse eines Labels in ein Register zu verschieben. – sivizius

Antwort

2

Wissen Sie, wie das in C funktioniert? Zeichenfolgen sind Zeiger und ein Zeichenfolgenarray ist ein Array von Zeigern. So brauchen Sie so etwas wie zu tun:

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

Beachten Sie, dass argsdd ist Zeigergröße Einzelteile zu erhalten, und es wird mit den Adressen von Strings gefüllt.