3

アセンブリでプログラムを作成していますが、機能していません。そのため、x86関数で変数を出力して、値が期待どおりであることを確認したいと思います。これを行う簡単な方法はありますか、それとも非常に複雑ですか?

簡単に言えば、アセンブリ関数はC関数から使用され、gccでコンパイルされています。

4

1 に答える 1

7

あなたの質問は「x86アセンブラで変数値を出力するにはどうすればよいですか」という方針に沿っているようです。x86自体は、使用している出力デバイス(およびその出力デバイスへのOS提供のインターフェイスの詳細)に完全に依存するため、その方法を認識していません。

別の回答で述べたように、これを行う1つの方法は、オペレーティングシステムのシステムコールを使用することです。x86 Linuxを使用している場合は、sys_writesys呼び出しを使用して、次のように文字列を標準出力に書き込むことができます(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つのこと:

  • レジスターは呼び出しによって破壊されるため、レジスターを保存して復元する必要があります。と
  • 関数を呼び出すと、引数は右から左の順序でプッシュされます。
于 2010-03-24T03:52:44.127 に答える