С Всегда ли должен изменяться счетчик программы (при тике часов)? , я уже знаю, что ПК не должен меняться при каждой синхронизации; в качестве конкретной инструкции может потребоваться более одного такта для выполнения.
Я бы хотел немного расширить этот вопрос. Допустим, у нас есть следующий простой C-код:
// gcc -g min.c -o min.exe # generate executable
// gcc -S min.c -o min.s # generate assembler listing from source
// objdump -S min.exe > min.sdump # generate assembler listing from executable
int main() {
int a;
a = 15;
return a;
}
Сравнивая списки ассемблера (objdump -S
не всегда очень точно разбрасывает строки исходного текста), я получаю что-то вроде этого:
min.s: min.sdump:
--------------------- -------------------------
main: 08048394 <main>:
pushl %ebp 8048394: 55 push %ebp
movl %esp, %ebp 8048395: 89 e5 mov %esp,%ebp
subl $16, %esp 8048397: 83 ec 10 sub $0x10,%esp
movl $15, -4(%ebp) 804839a: c7 45 fc 0f 00 00 00 movl $0xf,-0x4(%ebp)
movl -4(%ebp), %eax 80483a1: 8b 45 fc mov -0x4(%ebp),%eax
leave 80483a4: c9 leave
ret 80483a5: c3 ret
.size main, .-main 80483a6: 90 nop
Я знаю, что это, скорее всего, неправильно - но давайте предположим, что однобайтовые инструкции занимают один такт, а другие - два. Затем я мог бы взять «тик инструкции» в качестве нарастающего фронта часов в момент, когда «предыдущая» команда завершилась; как показано на следующей временной диаграмме (соответствует списку разборки; латексный / тикз-код для изображения можно найти здесь ):
Итак, перефразируя исходный вопрос:
... Всегда ли должен изменяться ПК (программный счетчик) (при каждом новом значении команды)?
Я думал, если инструкция установит ПК (или, скорее, следующий ПК), поэтому следующий адрес выполнения совпадает с его текущим, не было бы никакого способа выйти из этого цикла (если, конечно, не существует какого-либо внешнего прерывания)?