私はrdiでそれに渡されるものの10進値を出力するはずのサブルーチンを書いています。これは、32ビットで表現できるすべての数に最適です。 64ビットの値が関わるとすぐに事態が悪化します。NASMで64ビット番号を印刷するにはどうすればいいですか?
引数として4294967295または00000000000000000000000000000000000000000000000011111111111111111111111111111111bを渡すと、期待どおりに印刷されます。しかし、私がする場合
私は間違った結果(正確にX96)を取得します。
私は、引数のサイズをこのようにチェックしています:
mov rbx, rax ; rax has the orginal arg at this point
xor ebx, eax
cmp rbx, 0
jne isQword
mov ebx, eax
xor bx, ax
cmp ebx, 0
jne isDword
cmp ah, 0
jne isWord
jmp isByte
が起こってしまい、何がEBXセットを超えたビットを有するべきであり、isQwordにジャンプしなければならない値ではなくisDwordにジャンプしていることです。最初に印刷された文字はゴミとなり、残りの数字は正常に印刷されます。最初のコードスニペットを見てください:引数の値が0000000000000000000000000000000100000000000000000000000000000000bであることが予想され、ebxがクリアされた後にrbxにビットが設定されるため、isQwordへのジャンプが発生します。しかし、いいえ、この値はisByteまでフィルタリングし、 "X96"を出力します。
私はこれを理解できません。だれでも助けてくれますか?
32ビット演算で自動的に上位32ビットがゼロになるため、テストに失敗します。 'shr rbx、32; jnz isQword'が選択肢です。 – Jester
残りのコードはどこにありますか? –
これは良い質問になる可能性があります。 Linuxタグのためのリフレッシュ。 64ビットレジスタを印刷するために使用しているコードを表示する必要があります。スニペットはサイズを確認するために使用されていません。あなたが提供したコードには切断があるようです。 'rdi'に値を表示しますが、' rax'の値で操作を開始します。 'rbx'はおそらく多くのコードでグローバルオフセットテーブル(GOT)に使われているので、保存されるべきです。 – jww