2015-10-18 50 views
0

我想寫一個程序,它需要兩個參數:一個可執行文件的路徑和啓動該可執行文件的參數。 例子:NASM獲取參數和調用sys_execve

$ ./program /斌/平127.0.0.1

但我寫的似乎沒有做任何事情,你能告訴我什麼我做錯了的代碼?

global main 

section .text 
main: 
    push ebp 
    mov ebp, esp 
check_argc: 
    mov eax, [ebp + 8] ; eax <- argc 
    cmp eax, 1 
    jg do_execve 
    jmp done 
do_execve: 
    mov eax,11 ; linux system call number (11) - sys_execve 
    mov ebx,[ebp+12] ; ebx <- argv[1] 
    lea ecx,[ebp+12] ; ebx <- &argv[1] 
    mov edx,0 
    int 0x80 
done: 
    leave 
    ret 

編輯:

編譯我用:

$ NASM -f ELF32 program.asm

$ GCC -lc -m32 program.o -o的Program.exe

「check_argc」部分似乎工作,我檢查它與

+0

小調:每當'jg'圍繞一個'jmp'而沒有別的,你可以用一個'jle'來代替它。到'jmp'的目標。雖然不是你的問題。你鏈接到libc? – Davislor

+0

@Lorehead是的,我用「extern puts」 – Cristi

回答

1

你問題就在這裏:

mov ebx,[ebp+12] ; ebx <- argv[1] 
    lea ecx,[ebp+12] ; ebx <- &argv[1] 

主要的C語言是:int main(int argc, char** argv),所以你在做什麼居然是:

mov ebx,[ebp+12] ; ebx <- argv = &argv[0] 
    lea ecx,[ebp+12] ; ecx <- &argv 

你想要做的是一樣的東西的以下內容:

mov ecx, [ebp+12] ; ecx <- &argv[0] 
    add ecx, 4  ; ecx <- &argv[1] 
    mov ebx, [ecx] ; ebx <- argv[1] 
+0

它的工作原理,非常感謝! – Cristi