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()告诉没有这样的文件或目录。
答案 0 :(得分:0)
请记住,在C启动的情况下,你有一个指向你的args的指针数组,也没有在堆栈中推送的冗长的参数列表。
P.S。并且不要在深夜阅读编程书籍,因为你会在早上完全没有记住任何事情,并且会花一整天时间弄清楚你做错了什么:)