2015-02-06 110 views
1

我想讓bsr在64位數字上運行。但是,以下僅適用於輸入的低32位:64位bsr asm截斷高位32位

function BSR64(const Val: Int64): Integer; 
begin 
asm 
    bsr   eax, [Val] 
... 

我該如何做?

我正在使用Lazarus在64位模式下編譯。

回答

1

訪問64位寄存器如下:

bsr rax, [val] 

eax是低32位。 ax是低16和al是低8。

+0

這工作,謝謝。但是,我有一個誤解。我認爲結果寫入eax,所以eax應該是0到63. – IamIC 2015-02-06 06:23:07

+0

我不太確定你的意思。結果寫入'eax',但'eax'只是低32位(0到31位)。我不確定你的彙編程序在這種情況下會做什麼,因爲'val'似乎是一個64位的值,但我猜想它會截斷它只複製'[val]'的低32位。 – Tim 2015-02-06 06:33:14

+0

我的意思是,在64位輸入上,bsr的結果是0到63。我認爲「0」到「63」被bsr op壓入eax,這意味着它只有6位的範圍很容易適合eax。所以我認爲「0」到「63」被寫入到dest中,而不是dest必須與源大小匹配。 – IamIC 2015-02-06 06:37:22