2017-10-12 104 views
1

我正在使用sign extend將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 

輸出如下:

字值:爲0xffffffff 字擴展到64位:0x00000000ffffffff LSL:0x00000000ffffff00

什麼我在我的代碼丟失,使邏輯左移導致0xFFFFFFFF00000000?

回答

2

x格式化說明符會打印一個unsigned參數,它是我知道的ARM ABI上的32位類型。這導致printf忽略參數的高32位。使用llx打印long long unsigned參數; long long unsigned至少是64位類型。

+0

試過你的解決方案,它改變了打印格式,但並沒有解決邏輯移位丟失位的問題 – Sarchwalk

+0

@Sarchwalk你確定你已經修復了這兩個實例嗎? – fuz

+0

我得到了不計其數的零,後面是ffffffff和ffffff00 @fuz – Sarchwalk