无法打开以args方式传递的文件

时间:2017-03-15 16:02:05

标签: assembly inline-assembly fasm

    format ELF

    section '.bss' writeable
    BUFFLEN equ 256
    buff rb BUFFLEN

    section '.data' writeable
    writeCode db 'w',0
    readCode db 'r',0
    printStr db "%d. %s",0

    section '.text' executable
    extrn fopen
    extrn fclose
    extrn fprintf
    extrn fgets
    public main

main:
    push ebp
    mov ebp,esp
    push ebx
    push esi
    push edi



    mov eax,[ebp+8]
    cmp eax,3
    jne exit
openin:
    push readCode
    push dword[ebp+16]
    call fopen
    add esp,8
    mov esi,eax

openout:
    push writeCode
    push dword[ebp+20]
    call fopen
    add esp,8
    mov edi,eax

read:
    mov ebx,1
.rw:
    push esi
    push BUFFLEN
    push buff
    call fgets
    add esp,12
    cmp eax,0
    je close

    push buff
    push ebx
    push printStr
    push edi
    call fprintf
    add esp,16

    inc ebx
    jmp .rw

close:  
    push esi
    call fclose
    add esp,4

    push edi
    call fclose
    add esp,4



exit:
    pop edi
    pop esi
    pop ebx
    mov esp,ebp
    pop ebp
    ret

如果我通过以下内存地址: fileIn rb“test1”,0。一切正常,但当传递文件名为arg我得到分段错误。我已经尝试过完整路径,转移到regs等等,但没有任何帮助。 正如我想的那样,我可以通过这种方式将args传递给fopen(),因为它们以0结尾,不是吗? perror()告诉没有这样的文件或目录。

1 个答案:

答案 0 :(得分:0)

请记住,在C启动的情况下,你有一个指向你的args的指针数组,也没有在堆栈中推送的冗长的参数列表。

P.S。并且不要在深夜阅读编程书籍,因为你会在早上完全没有记住任何事情,并且会花一整天时间弄清楚你做错了什么:)