Как получить размер функции в байтах в ассемблере GNU с синтаксисом Intel? - PullRequest
0 голосов
/ 22 февраля 2019

Мне нужно вычислить размер функции в байтах во время сборки.Я пробовал различные способы, в том числе:

.set chk0_sz, offset chk0_e -  offset chk0_s 

, а затем с помощью mov rcx, offset chk0_sz для получения значения.

Однако выдает ошибку:

error: cannot use more than one symbol in memory operand.

Здесь chk0_e и chk0_s - две метки, обозначающие соответственно конец и начало функции.

Есть идеи?

1 Ответ

0 голосов
/ 22 февраля 2019

Ключевое слово offset необходимо использовать только при немедленном использовании адреса.В других контекстах, например, в качестве данных, его нельзя разыменовать, так что символ - это адрес.

Компиляторы обычно используют такие вещи, как .size chk0, . - chk0.Таким образом, вы, вероятно, хотите, чтобы

.equ  chk0_sz, . - chk0     # at the end of chk0

. была текущей позицией, она заменяется на chk0_e, если вы поставите .equ в этой позиции.


И, очевидно, выне может использовать rcx (регистр) как часть вычисления постоянной времени сборки.Или вы имели в виду от mov rcx, offset chk0_sz до использовать размер?

Если вы определите его как постоянную времени сборки с .equ, вы просто сделаете mov ecx, chk0_sz.Синтаксис в стиле MASM несовместим, так что это mov-немедленный, а не загрузка из-за того, как было определено chk0_sz.

...