ファイルからバイト(char)を書き出すcから呼び出される関数をアセンブラで作ってみたい。ここでは関数はCでどのように見えるべきかです:x86アセンブラでファイルにバイトを書き込む
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 ??()
アセンブリでこのような関数を書くにはどうしたらいいですか?
編集:私はcdecl慣例によると
あなたはアセンブラでライブラリをはstdてきていないので、コードはOSに依存することになります。 – Matt
ubuntuを使用しています。16.04 – polyx
fwriteを呼び出す際の最初のパラメータは、バイト自体を指すのではなく、そのバイトを指すアドレスです。プログラムを正しくリンクしていると仮定すると、fwriteはあなたのバイトをアドレスとして使用しようとしているため、segフォルトが発生している可能性が高く、仮想アドレス空間にマップされていないアドレスのメモリにアクセスします。 –