符号拡張を使用して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の?
あなたの解決策を試してみましたが、印刷フォーマットは変わりましたが、論理シフトの問題を解決しませんでした。 – Sarchwalk
@Sarchwalk両方のインスタンスを修正してもよろしいですか? – fuz
最後のケースでは、fffffffとffffff00の後ろに0の絶え間ない量が得られます。@fuz – Sarchwalk