2015-02-06 2 views
1

Я хочу, чтобы bsr работал на 64-битном номере. Тем не менее, нижеследующее работает только на младших 32 битах ввода:64-битный бит asm обрезает верхние 32 бита

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

Как это сделать?

Я компилирую в 64-разрядном режиме, используя Lazarus.

ответ

1

доступа 64-битный регистр следующим образом:

bsr rax, [val] 

eax является низкая 32 бита. ax является низким 16, а al является низким 8.

+0

Это сработало, спасибо. Но тогда у меня есть недоразумение. Я думал, что результат написан в eax, поэтому eax будет от 0 до 63. – IamIC

+0

Я не совсем уверен, что вы имеете в виду здесь. Результат записывается в 'eax', но' eax' - это только младшие 32 бита (бит от 0 до 31). Я не уверен, что ваш ассемблер будет делать в этом случае, так как 'val' выглядит как 64-битное значение, но я предполагаю, что он обрезает его, копируя только младшие 32 бита' [val] '. – Tim

+0

Я имею в виду, результат bsr от 0 до 63 на 64-битном входе. Я думал, что «0» до «63» вводится в eax с помощью bsr op, а его диапазон всего 6 бит легко вписывается в eax. Поэтому я подумал, что «0» до «63» записывается в dest, а не в том, что dest должен соответствовать размеру источника. – IamIC

 Смежные вопросы

  • Нет связанных вопросов^_^