2016-03-27 6 views
1

Как передать массив строк в качестве параметра для функции в ассемблере? Например позволяет сказать, что я хочу, чтобы вызвать функцию execve(), которая выглядит следующим образом:Как передать массив строк в качестве параметра для функции?

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

, так что я это сделать:

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 

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

Но когда я запускаю свою программу 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? Строки - это указатели, а строковый массив - это массив указателей. Таким образом, вам нужно сделать что-то вроде:

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

Обратите внимание, что args является dd для получения элементов размера указателя, и он заполняется с адресами строк.