Pergunta

Eu estava lendo algum código e não tinha certeza do que essa linha faz:

movq (%rsp), %rsp
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top