jmp *.L4 (,%rdx,8)
Я работаю над заданием, которое имеет это как один из его безусловных прыжков. Мои вопросы:Сборка, как интерпретировать прыжок с регистром после метки
- Как влияет rdx * 8 на скачок?
- какая разница * сделать перед тем .L4?
jmp *.L4 (,%rdx,8)
Я работаю над заданием, которое имеет это как один из его безусловных прыжков. Мои вопросы:Сборка, как интерпретировать прыжок с регистром после метки
Это просто косвенный прыжок через стол. Как вы, надеюсь, знаете, что .L4(,%rdx,8)
- адрес памяти, со значением .L4 + rdx * 8
. В 64-битных режимах указатели составляют 8 байтов, следовательно, коэффициент масштабирования. rdx
- это просто индекс записи в таблице.
*
не делает никакой разницы, кроме глушителей предупреждения о ассемблере :) Вы должны использовать *
косвенные прыжки, но когда ассемблер способен понять это, он просто будет выдавать предупреждение. (,%rdx,8)
- это мертвая распродажа, что это косвенный прыжок. Если бы у вас был jmp *.L4
, тогда *
потребуется разграничить его от jmp .L4
. Первый - это косвенный прыжок через указатель на .L4
, а последний - только прямой прыжок до .L4
.
спасибо за ваш ответ. Теперь мой вопрос: как вы вычисляете .L4 + rdx * 8? Я смущен, потому что .L4 - это ярлык, как работают надписи? Я также должен добавить, что все, что имеет место .L4, представляет собой ряд (.quad .L2) команд (L2-L7). Как узнать, к какой метке относится косвенный переход? – skob002
Как я уже сказал, 'rdx' - это индекс. Вы знаете только, к какому знаку он относится, если вы знаете значение в 'rdx'. Если 'rdx'' '0, он перейдет к первой метке, если она' 5', она перейдет на шестой ярлык и т. Д. – Jester
@ skob002: Все метки имеют адрес. –