2016-03-27 25 views
1

Dizgiler dizisinde toplayıcı olarak işlev görmek için parametre dizisini nasıl geçirebilirim? Örneğin Şöyle execve() işlevini aramak istediğiniz Diyelim:İşlev dizisi olarak dizge dizisi nasıl iletilir?

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

yüzden ben bunu:

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 

Ama programımı çalıştırdığımda(), istenen programı ve strace ./test'i yürütemedi. adaçayı:

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

Nasıl düzgün "args" geçmek değişken fonksiyonunu execve için?

Teşekkür :)

+0

Bir şeyin nasıl yapıldığını öğrenmek için, C'ye yazın ve derleyici çıktısına bakın. –

+0

Bir etiketin adresini bir kayıt defterine taşımak için 'lea ebx, [dosyaadı]' kullanın. – sivizius

cevap

2

bu C nasıl çalıştığını biliyor musunuz? Dizeler işaretçilerdir ve bir dize dizisi bir dizi işaretçidir. Böylece gibi bir şey yapmak gerekir: args işaretçi boyutu öğelerini almak için dd olduğunu

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

Bildirim olması ve bunun dizeleri adresleri ile doldurulur.