GCC Inline-сборка: вызов dword ptr - PullRequest
5 голосов
/ 10 августа 2010

Если у меня есть следующий код в Windows VC ++:

DWORD somevar = 0x12345678;
_asm call dword ptr [somevar]

Как я могу сделать то же самое в GCC inline-сборке, с синтаксисом AT & T?

__asm__ __volatile__ (
    "call dword ptr [%%edx]" : :
    "d" (somevar)
);

Я пробовал что-то подобное, но выдает ошибку "мусор" ...

И затем я попытался передать somevar в некоторые регистры, а затем преобразовать его в dword, ptr и т. Д., Но я не смог заставить его работать.

ОБНОВЛЕНИЕ: Я нашел кое-что, что было бы полезно, например, похоже, что в этом случае мы должны использовать скобки вместо скобок, и я нашел что-то с lcall для вызова far. Но я все еще не могу понять, как я могу воспроизвести dword ptr.

1 Ответ

7 голосов
/ 10 августа 2010

Вы не используете DWORD PTR или что-либо подобное с синтаксисом ассемблера AT & T. Длина операнда обычно берется из имени регистра (есть возможность предоставить суффикс с мнемоникой), который, в свою очередь, зависит от размера операнда C, который вы задаете asm (). Это очень хорошее свойство встроенного ассемблера, потому что это означает, что этот пример выполняется, если вы скомпилируете его для архитектуры x86_64 или i386. В первом случае сборка становится чем-то вроде call *%rdx, во втором случае становится call *%edx:

#include <stdio.h>
void p()
{
    puts("Hallo");
}
typedef void (*fp)();
int main()
{
    fp var=&p;
    var();  
    // put 'var' in a register, the '*' says call indirect:
    asm volatile ("call *%0"::"r"(var));
}

Вы можете прочитать код, сгенерированный GCC (попробуйте скомпилировать с -S), чтобы узнать синтаксис AT & T. Также попробуйте ввести Google, например:

ПРЕДУПРЕЖДЕНИЕ: Встроенная сборка с gcc не является тривиальным вопросом. Это связано с тем, что, в отличие от большинства других компиляторов, он предназначен для работы с оптимизатором. Вы должны действительно понимать, что означают и делают ограничения («r»), иначе вы нарушите свой код способами, которые вы не можете себе представить. Даже не думайте использовать его, прежде чем сможете ответить, что такое «ранний клоббер».

...