使用x86汇编程序

时间:2016-05-04 13:46:11

标签: c assembly

我想在汇编程序中创建一个函数,从c中调用一个字节(char)来写入文件。以下是函数在c中的外观:

void writebyte (FILE *f, char b)
{
    fwrite(&b, 1, 1, f);
}

这是代码,它将调用它:

#include <stdio.h>

extern void writebyte(FILE *, char);

int main(void) {
    FILE *f  = fopen("test.txt", "w");    
    writebyte(f, 1);
    fclose(f);
    return 0;
}

到目前为止,我想出了以下汇编程序代码:

    .global     writebyte  
writebyte:
    pushl   %ebp
    movl    %esp, %ebp  #standard params
    pushl   12(%ebp)    # pushing byte to the stack
    pushl   $1
    pushl   $1
    pushl   8(%ebp)     #file to write
    call    fwrite
    popl    %ebp
    ret

我一直从gdb获得:

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0xffa9702c in ?? ()

如何在汇编中编写这样的函数?

编辑:我使用的是Ubuntu 16.04

1 个答案:

答案 0 :(得分:3)

根据cdecl约定,您应该以相反的顺序推送参数。因此,f应该先行,而b应该最后。调用fwrite()后,调用者也应该清理堆栈。

如评论中所述,b将作为值接收,但我们需要将其作为指针传递给fwrite()。指针将等于ebp + 12的值。

这似乎对我有用:

    .global writebyte
writebyte:
    //create new stack frame
    pushl   %ebp
    movl    %esp, %ebp

    //push the four arguments to stack (in reverse order)
    pushl   8(%ebp)
    pushl   $1
    pushl   $1

    //get pointer of "b" argument (%ebp+12) and move it to %eax
    leal    12(%ebp), %eax
    pushl   %eax

    //call fwrite()
    call    fwrite

    //remove arguments from stack and pop %ebp
    leave

    ret