質問
私はアセンブリでプログラムを書いていますが、機能していないので、x86関数に変数を出力して、値が私が期待するものであることを確認したいと思います。これを行う簡単な方法はありますか、それとも非常に複雑ですか?
簡単にすると、アセンブリ機能がC関数から使用され、GCCでコンパイルされています。
解決
あなたの質問は、「x86アセンブラーで変数値を印刷するにはどうすればよいか」という線に沿っているようです。 X86自体は、それを行う方法を知りません。なぜなら、使用している出力デバイス(およびOSが提供するインターフェイスの詳細がその出力デバイスへの詳細)に完全に依存するからです。
それを行う1つの方法は、別の答えで自分自身を述べたように、オペレーティングシステムSyscallsを使用することです。 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 Standard Libraryからの機能(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つのこと:
- レジスタは、コールに巻き込まれるため、レジスタを保存および復元する必要があります。と
- 関数を呼び出すと、引数は右から左への順序でプッシュされます。
所属していません StackOverflow