0. O que é uma pilha?
Empilhar estrutura de dados ( estrutura de dados de pilha) dos mesmos princípios e a pilha de placa: adicionar um novo valor ao topo da pilha, remover o topo do valor da pilha também é removido. A pilha também é chamada de estrutura LIFO (Último a Entrar, Primeiro a Sair), o motivo é que o último valor inserido na pilha também é o primeiro valor a sair da pilha. (A estrutura de dados será discutida)
1. O princípio operacional da pilha
A pilha de tempo de execução é uma matriz de memória, e a CPU a gerencia diretamente com o registro ESP (ponteiro de pilha estendido), que é chamado de registro de ponteiro de pilha. No modo de 32 bits, o registro ESP armazena o deslocamento de 32 bits de uma determinada posição na pilha. O ESP basicamente não é controlado diretamente pelo programador, pelo contrário, é modificado indiretamente por instruções como CALL, RET, PUSH e POP. ESP sempre aponta para o último valor adicionado ou colocado no topo da pilha. A pilha de tempo de execução funciona no nível do sistema e lida com chamadas de sub-rotina. Stack ADT é uma estrutura de programação usada para implementar algoritmos baseados em operações last-in first-out.
2. Instruções de empilhamento
(1) instrução PUSH
A instrução PUSH primeiro reduz o valor de ESP e, em seguida, copia o operando de origem para a pilha.
(2) instrução POP
A instrução POP primeiro copia o conteúdo do elemento de pilha apontado por ESP para um operando de destino de 16 ou 32 bits e, em seguida, aumenta o valor de ESP.
(3) Instruções PUSHFD e POPFD
A instrução PUSHFD empurra o conteúdo do registrador EFLAGS de 32 bits para a pilha, enquanto a instrução POPFD empurra o conteúdo da célula superior da pilha para o registrador EFLAGS. A instrução MOV não pode ser usada para copiar o conteúdo do registrador do sinalizador para uma variável, portanto, PUSHFD pode ser a melhor maneira de salvar o bit do sinalizador. Às vezes é muito útil salvar uma cópia do registrador de sinalização para que o valor original do registrador de sinalização possa ser restaurado posteriormente.
(4) PUSHAD, PUSHA, POPAD e POPA
A instrução PUSHAD empurra todos os registradores de uso geral de 32 bits na pilha na ordem de EAX, ECX, EDX, EBX, ESP (valor antes de PUSHAD), EBP, ESI e EDI.
A instrução POPAD retira o mesmo registro da pilha na ordem inversa. Da mesma forma, a instrução PUSHA sequencialmente (AX, CX, DX, BX, SP, BP, SI e DI) empurra registradores de uso geral de 16 bits na pilha.
A instrução POPA retira o mesmo registro da pilha na ordem inversa. No modo de 16 bits, apenas as instruções PUSHA e POPA podem ser usadas.