Что означает «callq * (% rax)»? - PullRequest
2 голосов
/ 11 июля 2019

Я нахожусь в сеансе GDB для анализа посмертного сбоя. Я смотрю на вывод дизассемблирования для функции, и я вижу это:

=> 0x00007f8d354aed52 <+50>:    callq  *(%rax)

=> указывает, что это была инструкция, вызванная во время сбоя. Таким образом, я получил ошибку сегмента, вызывающую функцию на *(%rax). Я довольно новичок в сборке. Я вижу, что паренсы вокруг регистра означают, что нужно почтить (получить значение) этот адрес. Таким образом, (%rax) означает получить значение указателя, которое в данный момент хранится в %rax. Что делает украшение звезды на этом? Означает ли это дальнейшее разыменование этого значения (таким образом, (%rax) само по себе является указателем)? У меня проблемы с поиском *( синтаксиса ассемблера.

Это сборка x64, сгенерированная из GCC 4.8, компилирующего код C ++.

1 Ответ

2 голосов
/ 11 июля 2019

Звездочка указывает, что вызов является косвенным вызовом. Это должно отличить call foo (вызывать функцию foo) от call *foo (вызывать функцию, хранящуюся в переменной foo). Инструкция callq *(%rax) загружает четырехзначное слово (64 бита) из адреса, хранящегося в rax, и вызывает функцию, начинающуюся с этого четырехзначного слова.

Подробнее о синтаксисе см. В руководстве по сборке GNU.

...