So I understand a little bit on how it's all wired together. Instructions are stored in Registers
Não, as instruções são armazenadas na memória.
and the EIP/RIP points to Opcode that manipulates those registers (program code)
EIP / RIP aponta para o local da memória onde a CPU vai buscar a próxima instrução. Ele incrementa em 1 ou mais quando a instrução é recuperada e pode mudar completamente em uma ramificação, salto ou interrupção.
Os opcodes são a parte da instrução que realmente informa a CPU sobre o que fazer. Muitas instruções (não todas) consistem em um código de operação (novamente, a instrução real ou "comando") e os dados necessários pelo opcode (um "operando").
Alguns opcodes manipulam registros diretamente (isto é, MOV AX, imediato), muitos manipulam indiretamente os registros como efeitos colaterais (a maioria das instruções matemáticas afeta os FLAGS sob certas condições), e alguns não manipulam registros (não muitos) além de o ponteiro de instrução.
Cache é uma camada transparente entre a CPU e a RAM. A CPU verifica primeiro o cache - ao executar uma instrução que lê a memória - já que é muito mais rápida e tenta mantê-la carregada com dados usados com frequência. Em um programa assembly, você não precisa usar instruções especiais para que isso aconteça.
O registro de acessos não tem nada a ver com o cache. Os registradores podem estar envolvidos em uma operação que calcula qual localização de memória acessar, isto é, registradores podem ser usados como ponteiros e índices (endereçamento "indexado" ou "indireto"), mas endereços também podem ser especificados diretamente em instruções em linguagem assembly (este é o modo de endereçamento "absoluto"). Agora, as CPUs x86 têm um recurso transparente de "renomeação de registro" que é usado para suportar a execução fora de ordem, mas não está vinculado ao cache on-chip.
No x86, há algumas instruções que limpam o cache, e algumas CPUs permitem que você configure o cache como "cache-as-RAM" - onde a CPU usa apenas o cache e não acessa a RAM. Isso é útil se o código precisar ser executado antes que a RAM seja inicializada, como quando um firmware do sistema ou SO for iniciado ou sem perturbar a RAM, como um manipulador de falhas do sistema operacional.