В настоящее время я выполняю назначение, которое измеряет производительность различных команд x86-64 (в формате t).x86-64 Относительная производительность jmp
Команда, с которой я немного смущен, является командой «безусловный jmp». Вот как я его реализовал:
.global uncond
uncond:
.rept 10000
jmp . + 2
.endr
mov $10000, %rax
ret
Это довольно просто. Код создает функцию, называемую «uncond», которая использует директиву .rept для вызова команды jmp 10000 раз, затем устанавливает возвращаемое значение на количество раз, когда вы вызывали команду jmp.
"." in at & t синтаксис означает текущий адрес, который я увеличиваю на 2 байта, чтобы учесть собственно инструкцию jmp (поэтому jmp. + 2 должен просто перейти к следующей команде).
Код, который я не показал, вычисляет количество циклов, необходимых для обработки команд 10000.
Мои результаты говорят, что jmp довольно медленный (занимает 10 циклов для обработки одной команды jmp), но из того, что я понимаю о конвейерной обработке, безусловные переходы должны быть очень быстрыми (ошибки предсказания ветвления).
Я что-то упустил? Является ли мой код неправильным?
Возможный дубликат [Медленная jmp-инструкция] (http://stackoverflow.com/questions/38811901/slow-jmp-instruction).Этот более подробный вопрос имеет намного лучший и более подробный ответ. –