Assembly 64位bsr asm正在截断高32位

Assembly 64位bsr asm正在截断高32位,assembly,x86-64,lazarus,freepascal,Assembly,X86 64,Lazarus,Freepascal,我希望bsr对64位数字进行操作。但是,以下仅适用于输入的较低32位: function BSR64(const Val: Int64): Integer; begin asm bsr eax, [Val] ... 我该怎么做 我正在使用Lazarus以64位模式编译。按如下方式访问64位寄存器: bsr rax, [val] eax是低32位ax为低位16,al为低位8 使用32位寄存器目标意味着内存的32位操作数大小。BSR要求它们匹配,就像除了有效的mo

我希望bsr对64位数字进行操作。但是,以下仅适用于输入的较低32位:

function BSR64(const Val: Int64): Integer;
begin
asm
  bsr           eax, [Val]   
...
我该怎么做


我正在使用Lazarus以64位模式编译。

按如下方式访问64位寄存器:

 bsr rax, [val]
eax
是低32位
ax
为低位16,
al
为低位8


使用32位寄存器目标意味着内存的32位操作数大小。BSR要求它们匹配,就像除了有效的
movzx
movsx
之外的几乎所有其他指令一样,谢谢。但是我有个误会。我以为结果写进了eax,所以eax应该是0到63。我不太确定你在这里的意思。结果写入
eax
,但
eax
仅为低位32位(位0到31)。我不确定您的汇编程序在这种情况下会做什么,因为
val
似乎是一个64位的值,但我猜它会截断它,只复制
[val]
@IanC的低32位:如果您以64位模式写入32位寄存器,则会“破坏”64位寄存器的高部分。来自英特尔:“32位操作数生成32位结果,在目标通用寄存器中将零扩展为64位结果。”@IanC它不会破坏输入,甚至不会读取输入。没有一种版本的bsr读64位写32位,两种大小必须相同。写入32位会破坏输出寄存器的高半部。为什么不使用BsrQWord函数:?