LINUX.ORG.RU

большая константа в ассемблерной вставке


0

0

Доброго времени суток,

Помогите разобраться в следующем (gcc 4.3.2, linux x86_64):

если я пишу код:

__asm__ {
        ....
        "andq   $0x3FFFFFFFFFFFFFFF, %%rax \n\t"
        ....
}

то компилятор ругается «suffix or operands invalid for `and'»

если пишу так,

__asm__ {
        ....
        "movq   $0x3FFFFFFFFFFFFFFF, %%r8 \n\t"    
        "andq   %%r8, %%rax \n\t"
        ....
}

то всё ок. хoтя первый способ тоже должен работать имхо. Интересно, что еcли заменить $0x3FFFFFFFFFFFFFFF, скажем, на 0х3FFF, то всё ништяк. Косяк ли это? Если да, то как его обойти?


возможно система машинных команд процессора не позволяет
встраивать в некоторые команды слишком большую константу

fghj ★★★★★
()

У AND нет опкода для работы с 64-битным immediate. Или через регистры сравнивай, как сейчас делает, или константу в памяти держи и сравнивай с памятью:

and myconst, %%rax

myconst: .quad $0x3FFFFFFFFFFFFFFF

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.