在YASM Assembly中无法使用fopen

时间:2016-10-21 15:03:38

标签: linux assembly x86-64 calling-convention

基本上我试图做的是制作一个文件的副本 - 实际上,它还有很多,但我无法克服这个第一个障碍 - 在x86_64 Linux上使用YASM程序集。我的问题是我似乎无法多次使用fopen。

到目前为止我的代码:

segment .data
RW  dd  "w+", 0             ; RW -- read write (creates)
RO  dd  "r" , 0             ; RO -- read only
po  dq  0                   ; po -- pointer original
pn  dq  0                   ; pn -- pointer new

    segment .text

    global border
    extern fopen
    extern fclose
    extern fputc

border:
    push rbp
    mov rbp, rsp

    mov r8, rdi             ; r8 -- the original file name
    mov r9, rsi             ; r9 -- the destination file

    mov rdi, r8
    lea rsi, [RO]
    call fopen
    mov [po], rax

    mov rdi, r9
    lea rsi, [RW]
    call fopen
    mov [pn], rax

    mov rdi, "B"   ; Just a test to know if worked.
    mov rsi, [pn]
    call fputc

EXIT:
    mov rdi, [po]
    call fclose
    mov rdi, [pn]
    call fclose
    mov rsp, rbp
    pop rbp
    ret

它来自以下C程序:

char* source = "TestNorm.txt";
char* dest = "TestDest.txt";
border(source, dest);

我已尝试了一些事情,但最终归结为第二次fopen无法正常工作 - 文件未打开,当我尝试使用文件指针时,我显然遇到了一个段错误 - - 但第一个完美无缺。

我完全被这个人难住了。任何帮助将不胜感激。

0 个答案:

没有答案