質問

私はアセンブリでプログラムを書いていますが、機能していないので、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つのこと:

  • レジスタは、コールに巻き込まれるため、レジスタを保存および復元する必要があります。と
  • 関数を呼び出すと、引数は右から左への順序でプッシュされます。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top