Пояснение к этому ассемблерному коду - PullRequest
3 голосов
/ 02 июня 2011
void* curbrk;

__asm__ __volatile__(
    "mov .curbrk, %%rax;"
    "mov %%rax, %0"
        : "=r" (curbrk)
        :: "%rax"
);

Может кто-нибудь объяснить, что делает этот простой ассемблерный код? Благодаря.

1 Ответ

3 голосов
/ 02 июня 2011

Копирует значение символа .value, возможно, определенного где-то в сборке или сценарии компоновщика, в переменную C curbrk, что приводит к засорению регистра RAX в процессе.

.curbrk, вероятно, указывает на текущий конец сегмента данных. Похоже, Glibc определяет похожий символ __curbrk, вы, вероятно, используете какой-то другой libc (BSD?). В любом случае, sbrk(0) будет более портативным способом доступа к этому значению.

Посмотрев на перекрестную ссылку FreeBSD, я могу сказать, что она действительно указывает на текущий конец сегмента данных: он используется как в brk(), так и в sbrk(), используя макрос HIDENAME для добавления ., и он появляется в System.map amd64 (это версия сценария компоновщика FreeBSD?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...