nop
pseudolyszt.net aborda nop e outras instruções RISC-V com mais detalhes.
Descrição
nop não faz nada. O nome é a abreviação de "no operation" (nenhuma operação). Quando o processador alcança um nop, nenhum registrador muda, nenhuma memória é tocada, e a execução continua com a próxima instrução. Ele ocupa um slot no programa e um tick de tempo passa.
nop é uma pseudo-instrução para a linha abaixo.
addi zero, zero, 0
O RISC-V inclui um registrador chamado zero que sempre contém 0. Uma leitura retorna 0, e uma escrita é descartada. Esse addi soma 0 e 0 e descarta o resultado, então a instrução é concluída e nada muda. O RISC-V não precisa de um nop dedicado porque o registrador zero fornece um.
Processadores reais usam nops como preenchimento, para que uma instrução posterior comece em um limite de memória que o hardware trata mais rapidamente, e como espaços reservados que ferramentas sobrescrevem depois com instruções reais. Compiladores os inserem naturalmente, e é por isso que o código desmontado os contém mesmo que nenhum programador os tenha digitado.
O manual do RISC-V afirma que nop não altera nenhum estado visível arquiteturalmente, ou seja, nada que um programa possa observar, exceto avançar o pc e incrementar quaisquer contadores de desempenho. Ele dá dois usos: alinhar segmentos de código a limites de endereço adequados ao hardware, e deixar espaço para alterações posteriores no código. O manual explica que a codificação usa addi porque essa instrução custa menos recursos na maioria dos sistemas, já que lê apenas um registrador.
Neste simulador, nop serve como espaçador ou marcador durante experimentos. Passar por cima de um avança o pc em 4 e não altera nenhum registrador ou posição de memória.
Expande para
addi zero, zero, 0
O montador substitui esta pseudoinstrução pela instrução ou instruções reais listadas acima.
Exemplo
li t0, 1 nop # advances one instruction, changes nothing addi t0, t0, 1 # t0 = 2
