printf()のシステムコールを自作しました。
アセンブリ言語を勉強し始めたばかりです。
64 bit linux, Debian系です。intel CPU
システムコール番号の確認
linux-4.7.3/arch/x86/entry/syscalls/syscall_64.tbl
0 common read sys_read 1 common write sys_write 2 common open sys_open 3 common close sys_close 4 common stat sys_newstat
writeシステムコールを使用するので、1番ですね!!
// write.S .global _write _write: push %rbx mov $1, %rax mov 8(%rsp), %rbx mov 12(%rsp), %rcx mov 16(%rsp), %rdx syscall pop %rbx ret
C
1int main(){ 2 _write(1, "Hello_World\n!!", 14); 3 return 0; 4}
一番最初のパラメータはファイルディスクリプタを1にしています。
bash
1gcc -c write.S -o write.o 2gcc -c main.c -o main.o 3 4gcc main.o -lc write.o // リンク 5 6gcc main.c write.S -o _write //こちらでやると warningが出てきますね。
warning、エラーともにありません。
が・・・・
実行しても何も表示されません。
なぜでしょうか?
教えてください。
「追記」
少し修正しました。
starceでおかしい部分を探しました。
printf()の正常な場合は・・・
write(1, "Hello_World!!\n", 14Hello_World!!
) = 14
上記のアセンブリの場合・・・
write(1, "Hello_World!!\n\0\0\1\33\3;<\0\0\0\6\0\0\0\320\375\377\377"..., 94771697825424) = -1 EFAULT (Bad address)
exit_group(0) = ?
なんか途中からおかしな文字列が入り込んでいますね・・・
なんでしょうかね??これ・・・・

回答2件
あなたの回答
tips
プレビュー