我想在汇编程序中创建一个函数,从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
答案 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