2017-10-12 11 views
1

符号拡張を使用して32ビットの変数を64ビットの変数に変更しています。しかし、64ビット変数に論理シフトを使用すると、32ビットのままであるようにビットが失われます。アセンブラで符号拡張後に論理シフトが失われていくARMv8

私は最終的に私の元の変数から64ビット変数の上側に全てをシフトすることができます。

(0xFFFFFFFF00000000私は期待していた結果である)以下のコードは、ビットが失われる場合を実証するために8ビットのシフトを示す:

str_fmt:.string "\nWord Value: 0x%08x \nWord Extended to 64-bit: 0x%016x\nLSL: 0x%016x\n\n" 

     .balign 4 
     .global main  

main: stp  x29, x30, [sp, -16]!  
     mov  x29, sp   

     mov  w19, 0xFFFFFFFF 
     sxtw x20, w19 

     lsl  x21, x20, 8 

results: 
     adrp x0, str_fmt  
     add  x0, x0, :lo12:str_fmt 
     mov  w1, w19    
     mov  x2, x20 
     mov  x3, x21 
     bl  printf 

done: ldp  x29, x30, [sp], 16 
     ret 

次のように出力される。

ワード値: 0xFFFFFFFF00000000をもたらすために残され0x00000000ffffff00

が、私は論理シフトを許可するように私のコードで何をしないのです: LSL 0x00000000ffffffff:64ビットに拡張 Wordが0xffffffffの?

答えて

2

xフォーマット指定子は、私が知っているARM ABIの32ビットタイプのunsigned引数を出力します。これにより、printfは引数の上位32ビットを無視します。 long long unsigned引数を出力するにはllxを使用してください。 long long unsignedは、少なくとも64ビットタイプです。

+0

あなたの解決策を試してみましたが、印刷フォーマットは変わりましたが、論理シフトの問題を解決しませんでした。 – Sarchwalk

+0

@Sarchwalk両方のインスタンスを修正してもよろしいですか? – fuz

+0

最後のケースでは、fffffffとffffff00の後ろに0の絶え間ない量が得られます。@fuz – Sarchwalk

関連する問題