2016-02-14 5 views

ответ

2

Это просто косвенный прыжок через стол. Как вы, надеюсь, знаете, что .L4(,%rdx,8) - адрес памяти, со значением .L4 + rdx * 8. В 64-битных режимах указатели составляют 8 байтов, следовательно, коэффициент масштабирования. rdx - это просто индекс записи в таблице.

* не делает никакой разницы, кроме глушителей предупреждения о ассемблере :) Вы должны использовать * косвенные прыжки, но когда ассемблер способен понять это, он просто будет выдавать предупреждение. (,%rdx,8) - это мертвая распродажа, что это косвенный прыжок. Если бы у вас был jmp *.L4, тогда * потребуется разграничить его от jmp .L4. Первый - это косвенный прыжок через указатель на .L4, а последний - только прямой прыжок до .L4.

+0

спасибо за ваш ответ. Теперь мой вопрос: как вы вычисляете .L4 + rdx * 8? Я смущен, потому что .L4 - это ярлык, как работают надписи? Я также должен добавить, что все, что имеет место .L4, представляет собой ряд (.quad .L2) команд (L2-L7). Как узнать, к какой метке относится косвенный переход? – skob002

+0

Как я уже сказал, 'rdx' - это индекс. Вы знаете только, к какому знаку он относится, если вы знаете значение в 'rdx'. Если 'rdx'' '0, он перейдет к первой метке, если она' 5', она перейдет на шестой ярлык и т. Д. – Jester

+0

@ skob002: Все метки имеют адрес. –