Необходимо преобразовать старый 32-битный код GAS в текущий ассемблер GAS (pushfl / popl) - PullRequest
1 голос
/ 26 июля 2011

Я пытаюсь скомпилировать старый проект на моей современной машине.Я знаю, что этот старый проект использовал старую (2.x) версию GCC / GAS, поэтому мне нужно очистить ее, чтобы я мог скомпилировать ее с текущей версией.

Код, о котором идет речь:

__get_flags:
    pushfl
    popl %eax
    ret

gas жалуется, что pushfl не инструкция.Из того, что я прочитал, это старая устаревшая мнемоника GNU, но наверняка должен быть какой-то эквивалент x86_64?

В дополнение к ответу о том, как преобразовать этот код в газ x86_64, было бы здоровообъясните, где такие мнемоники, как pushfl и pushfq, определены и задокументированы.Я совершенно уверен, что это создания GAS ...

Примечание: я хочу скомпилировать это на gcc 4.6.1 и gas 2.21

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

Следующее:

static inline u16 __get_flags(void) {
    u16 flags;
    asm ("pushf\n\t"
         "pop %0" : : "+r"(flags) : "cc");
    return flags;
}

должно быть на самом деле переносным для 64/32 бит, x64 / x86.Но он получает только коды условий, а не верхние части государственного реестра.Если вам требуется все содержимое регистра флагов при работе в 64-битном (длинном) режиме, используйте имя инструкции PUSHFQ с операндом u64 (или другим 64-битным количеством).

0 голосов
/ 27 ноября 2014

Я не могу добавить комментарий к ответу, потому что у меня нет 50 репутации.В любом случае:

В ответе:

"pop %0" : : "+r"(flags) : "cc");

Следует читать:

"pop %0" : "=r"(flags) : : "cc");

Поскольку синтаксис asm( code : outputs : inputs : clobbers ) и вы хотите, чтобы флаги были регистромэто вывод из блока asm, не используется в качестве ввода.(Я проверил это, и оно работало для меня, я также использовал 64-битные целые числа)

...