Função de montagem do MOVQ
Pergunta
Eu estava lendo algum código e não tinha certeza do que essa linha faz:
movq (%rsp), %rsp
Solução
movq
(Supondo que você esteja falando sobre x86) é um movimento de uma quadra (valor de 64 bits). Esta instrução em particular:
movq (%rsp), %rsp
Parece muito com o código que caminhará pelos quadros de pilha. Esta instrução específica agarra a quadra apontada pelo ponteiro da pilha atual e o carrega no ponteiro da pilha, substituindo -o.
A título de exemplo, essa sequência de código (com base no código real, e na Intel, em vez de o formato AT&T) carregará continuamente o ponteiro da pilha do seu conteúdo até que o valor 16 bytes além dele seja 0.
576 cmpq [rsp+0x10],0x0
582 jz 594
588 movq rsp,[rsp]
592 jmp 576
594 ...
É possível que não seja o código de caminhada em quadra de pilha, mas é incomum, pois estaria subornando o ponteiro da pilha para algo para o qual geralmente não é usado.
Isto é Incomum, pois os quadros de pilha subir geralmente envolve o ponteiro da pilha e o ponteiro da base, mas isso geralmente é apenas subir um nível (ou seja, um retorno de uma função).
Para o tipo de código mostrado acima, onde você deseja subir vários níveis, provavelmente é mais rápido usar o ponteiro da pilha até chegar aonde você precisa estar, depois coloque o ponteiro da base então (chamando convenções geralmente empurra a base atual ponteiro antes de alterá -lo, para que um pop simples recupere o valor antigo).
Outras dicas
É um valor de valor de 64 bits. É 64 bits devido ao "Q" no MovQ, que é Quad e Quad, é de 64 bits.
Pode haver outro exemplo, como o MOVL, no qual L é de 32 bits.
Mas no caso do MOVQ ( %RSP), %rsp usando a sintaxe ATT ..
O MOVQ ( %rsp), %rsp -> movq é chamado OPCode, ( %rsp) é chamado de origem ou src e %rsp é chamado de destino ou DST.
O que faz é procurar no registro %rsp obtém seu valor e vai para a memória [o suporte "()" significa entrar no valor da memória] desse valor e, em seguida, atribui -o ao %RSP.
Embora ambos sejam o mesmo registro, a diferença é que o valor de %RSP altera.
Por exemplo: digamos que %rsp tenha valor 22. Mas a memória de %rsp é 30.
Usando esta instrução movq ( %rsp), %rsp
O novo valor de %rsp é 30. Novamente porque ( %rsp) obtém o valor de %rsp que é assumido 22 e, em seguida, ( %rsp) vai para o valor da memória 30 e depois atribui -o a %rsp no destino, que é %rsp em si.