Instruções de turno As instruções shift movem os bits de um registro para a esquerda ou para a direita. Isso pode ser útil para diversos fins, como:
* Multiplicando ou dividindo por potências de 2
* Extrair ou inserir bits específicos de um registrador
* Invertendo a ordem dos bits em um registrador
Existem dois tipos principais de instruções de mudança:mudanças lógicas e mudanças aritméticas.
*
Mudanças lógicas desloca todos os bits em um registro, incluindo o bit de sinal. Isso significa que o valor do registrador pode mudar após uma mudança lógica.
*
Deslocamentos aritméticos apenas desloca os bits de dados em um registro, não o bit de sinal. Isto significa que o valor do registrador não mudará após uma mudança aritmética.
A tabela a seguir mostra as diferentes instruções de deslocamento disponíveis na maioria dos processadores:
| Instrução | Descrição |
|---|---|
| `SHL` | Deslocar para a esquerda lógico |
| `SHR` | Deslocar para a direita lógico |
| `SAR` | Deslocar aritmética para a direita |
| `ROL` | Girar para a esquerda |
| `ROR` | Girar para a direita |
Instruções de rotação As instruções de rotação são semelhantes às instruções de deslocamento, exceto que elas giram os bits de um registro em vez de deslocá-los. Isso significa que os bits de uma extremidade do registrador se moverão para a outra extremidade.
As instruções de rotação podem ser úteis para diversos fins, como:
* Gerando buffers circulares
* Trocando o conteúdo de dois registros
* Implementação de certos algoritmos criptográficos
A tabela a seguir mostra as diferentes instruções de rotação disponíveis na maioria dos processadores:
| Instrução | Descrição |
|---|---|
| `ROL` | Girar para a esquerda |
| `ROR` | Girar para a direita |
Exemplos Aqui estão alguns exemplos de como as instruções de deslocamento e rotação podem ser usadas:
* Para multiplicar um número por 2, você pode usar a instrução shift left. Por exemplo, o código a seguir multiplica o valor no registro `EAX` por 2:
```
shl eax, 1
```
* Para dividir um número por 2, você pode usar a instrução shift right. Por exemplo, o código a seguir divide o valor no registro `EAX` por 2:
```
shr eax, 1
```
* Para extrair o byte menos significativo de um registrador, você pode usar uma instrução shift right. Por exemplo, o código a seguir extrai o byte menos significativo do registro `EAX` e o armazena no registro `AL`:
```
shr eax, 8
mov al, eax
```
* Para inserir um byte específico em um registro, você pode usar uma instrução shift left. Por exemplo, o código a seguir insere o valor 0x12 no byte menos significativo do registro `EAX`:
```
movimento al, 0x12
shl eax, 8
```
* Para inverter a ordem dos bits em um registrador, você pode usar uma instrução de rotação para a esquerda. Por exemplo, o código a seguir inverte a ordem dos bits no registro `EAX`:
```
papel eax, 8
```