アセンブリでプログラムを作成していますが、機能していません。そのため、x86関数で変数を出力して、値が期待どおりであることを確認したいと思います。これを行う簡単な方法はありますか、それとも非常に複雑ですか?
簡単に言えば、アセンブリ関数はC関数から使用され、gccでコンパイルされています。
あなたの質問は「x86アセンブラで変数値を出力するにはどうすればよいですか」という方針に沿っているようです。x86自体は、使用している出力デバイス(およびその出力デバイスへのOS提供のインターフェイスの詳細)に完全に依存するため、その方法を認識していません。
別の回答で述べたように、これを行う1つの方法は、オペレーティングシステムのシステムコールを使用することです。x86 Linuxを使用している場合は、sys_write
sys呼び出しを使用して、次のように文字列を標準出力に書き込むことができます(GNUアセンブラ構文)。
STR:
.string "message from assembler\n"
.globl asmfunc
.type asmfunc, @function
asmfunc:
movl $4, %eax # sys_write
movl $1, %ebx # stdout
leal STR, %ecx #
movl $23, %edx # length
int $0x80 # syscall
ret
ただし、数値を出力する場合、最も柔軟な方法はprintf()
、C標準ライブラリの関数を使用することです(Cからアセンブラルーチンを呼び出しているため、とにかく標準ライブラリにリンクしている可能性があります)。 )。これは例です:
int_format:
.string "%d\n"
.globl asmfunc2
.type asmfunc2, @function
asmfunc2:
movl $123456, %eax
# print content of %eax as decimal integer
pusha # save all registers
pushl %eax
pushl $int_format
call printf
add $8, %esp # remove arguments from stack
popa # restore saved registers
ret
注意すべき2つのこと: