Да, регистры данных могут измениться при последующих инструкциях, что довольно часто. Существуют и другие сложности, связанные с суперскалярностью, выполнением вне порядка, конвейерной обработкой, переименованием регистров и т. Д. c, которые усложняют анализ, но даже на простом процессоре, работающем по порядку, регистр может изменяться так же часто, как один раз на инструкцию. Правдоподобная программа может иметь множество команд, все из которых влияют на один и тот же регистр:
// Type your code here, or load an example.
int polynom(int num) {
return num * num + 2 * num + 1;
}
, который компилируется как:
polynom(int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], edi
* mov eax, DWORD PTR [rbp-4]
* imul eax, eax
* mov edx, DWORD PTR [rbp-4]
add edx, edx
* add eax, edx
* add eax, 1
pop rbp
ret
Обратите внимание на множество записей в регистр eax
, отмечен звездочкой. В этой маленькой функции пять почти последовательных инструкций записывают в этот регистр c, что означает, что мы можем ожидать, что видимое программой состояние eax
1 изменится в с частотой более 1 ГГц, если этот код должен вызываться с жесткой l oop.
На более фундаментальной ноте есть некоторые архитектурные регистры, которые почти всегда изменяются в каждой инструкции , Наиболее очевидным из них является программный счетчик (во многих контекстах он называется P C, EIP
на x86, RIP
на x86_64). Поскольку этот регистр указывает на выполняемую в настоящее время инструкцию, он, безусловно, должен меняться с каждой инструкцией, за исключением контрпримеров, таких как кодировки x86 REP, или инструкции, которая просто переходит к самому себе.
1 Опять же, за исключением архитектур соображения, такие как переименование регистров, при котором используются несколько физических регистров для реализации одного логического, видимого программой регистра.