私は自分自身のx86を教えしようとしている、と私はすぐに、負の数を返す必要が渡って実行しました:私は、この関数の戻り値を印刷するときx86では64ビットのネガティブを即座にエンコードできますか?
.text
.align 4,0x90
.globl _scheme_entry
_scheme_entry:
movl $-42, %eax
ret
は(printf("%" PRIdPTR "\n", scheme_entry())
、私が取得ナンセンス番号:それは代わりに、64ビットの、負00000000FFFFFFFF 32ビットの負だから
$ ./neg
4294967254
私はこれを推測しているが、FFFFFFFFFFFFFFFFある
私は定数64ビットの値を格納するにはどうすればよいです。アセンブラ機能で直接に?私は2つの別々の指示としてそれをコード化しなければならないのですか?
あなたは間違ってそれを印刷していませんか? 'scheme_entry'は32ビットの整数を返すようです(そうでなければ' eax'に入れていますか?) – harold
gccは通常、関数のエントリポイントを16バイトに整列します。パディングが1バイトのNOPになるように強制する理由もありません(実行されないため)。 '.p2align 4'を使って' 1 << 4'に整列させてください。 (このような小さな機能のために、8バイトの境界は関数全体をカバーするので、 '.p2align 3'とすることができます。)現代のCPUは、古いCPUほどコードの位置合わせに敏感ではありませんが、 NOP埋め込みは実行されません。そのかなりのが、私の頭の上にある –
@PeterCordes - 私は[コンパイラ書き込みチュートリアル](http://scheme2006.cs.uchicago.edu/11-ghuloum.pdf)に沿って、以下のよ、意図的に私たちを持っています小さなCの入力に対して 'gcc'の出力を使ってコンパイラから何を出すかを決めます。上記のボイラープレートは、基本的にそのままコピーされていましたが、私はまだそれが何かを学んだことはありません! :x – ELLIOTTCABLE