2017-07-02 8 views
0

私は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"を出力します。

私はこれを理解できません。だれでも助けてくれますか?

+3

32ビット演算で自動的に上位32ビットがゼロになるため、テストに失敗します。 'shr rbx、32; jnz isQword'が選択肢です。 – Jester

+1

残りのコードはどこにありますか? –

+0

これは良い質問になる可能性があります。 Linuxタグのためのリフレッシュ。 64ビットレジスタを印刷するために使用しているコードを表示する必要があります。スニペットはサイズを確認するために使用されていません。あなたが提供したコードには切断があるようです。 'rdi'に値を表示しますが、' rax'の値で操作を開始します。 'rbx'はおそらく多くのコードでグローバルオフセットテーブル(GOT)に使われているので、保存されるべきです。 – jww

答えて

2

これが解決しました。ありがとうございます。

私のコードが64ビット値を検出できなかった理由は、レジスタ上で32ビット演算を実行すると、そのレジスタの上位32ビットがクリアされるということです。

; rax has the orginal rdi argument at this point in the code 
mov rbx, rax 
xor ebx, eax ; this clears the upper 32 bits of rbx 
cmp rbx, 0 ; these are equal 
jne isQword ; so we don't get to isQword when we should 
関連する問題