меня интересует следующий вопрос: в случае, если команда не помещается на странице (к примеру, осталось два байта, а для jmp'а нужно больше =) ), то как такая ситуация эффективно разрешается (помимо очевидного решения: переход на другую страницу с забиванием оставшегося места nop'ами)? извиняюсь за, возможно, глупый вопрос. заранее спасибо
one_man Интересно, почему у тебя возник вопрос иммено о страницах ? Дело в том, что частная и редкая ситуация разбивки инструкции границей страниц практически не отличается от общей и значительно более частой ситуации разбивки инструкций границами линеек кэша или 16-байтных блоков декодирования в P6+. При повторных проходах куска кода (следующая страница инициализирована, ее запись есть в TLB, первая линейка находится в кэше) - разницы вообще нет. В противном случае возникают большие тормоза независимо от того бъется инструкция границей страницы или нет. Ну а в общем случае возиться с выравниваниями имеет смысл только при оптимизации циклов, когда экономия одного такта декодирования может дать заметный выигрыш в бщем времени обработки. И тут выталкивание инструкции перехода (jcc,jmp,call) в следующий блок декодирования ничего не дает, т.к. в P6+ процессор все равно вынужден подгружать "лишние" 16 байт кода ради одной инструкции и затем сразу грузить другие 16 байт по метке перехода (в P4 NetBurst это вообще не важно - там кэш трасс рулит). Эффективнее наоборот пытаться "ужать" предыдущий код, чтобы уместить инструкцию перехода целиком в текущем блоке. Это как раз та ситуация, когда не следует тупо следовать рекомендации выравнивания метки цикла на 16 байт - "при ловле блох" нужно смотреть конкретный код и экспериментировать - часто бывает, что смещение метки цикла в P6+ ускоряет обработку именно за счет того, что устраняет разбивку и\или "перескок" jсс в следующий блок