Pregunta

Yo estaba leyendo algo de código y no estaba seguro de lo que hace esta línea:

movq (%rsp), %rsp
¿Fue útil?

Solución

movq (suponiendo que estamos hablando x 86) es un movimiento de un (valor de 64 bits) palabra cuádruple. Esta instrucción particular:

movq (%rsp), %rsp

se parece mucho código que le guiará a través de los marcos de pila. Esta instrucción particular agarra la palabra cuádruple apuntado por el puntero de pila actual y los carga en el puntero de pila, sobreescribiéndolo.

A modo de ejemplo, esta secuencia de códigos (basado en el código real, y en Intel en lugar de que AT & T formato) se carga continuamente el puntero de pila de su contenido hasta que el valor de 16 bytes más allá de ella es 0.

576  cmpq    [rsp+0x10],0x0
582  jz      594
588  movq    rsp,[rsp]
592  jmp     576
594  ...

Es posible que no sea código caminar pila fotograma pero es inusual ya que estaría soborno el puntero de pila para algo que no es generalmente utilizado para.

es inusual en que se mueve hacia arriba marcos de pila por lo general implica puntero de pila y la base puntero pero eso es por lo general sólo para subir un nivel (es decir, un retorno de una función).

Para el tipo de código que se muestra por encima de la que desea subir múltiples niveles, es probable que sea más rápido que sólo tiene que utilizar el puntero de pila hasta que llegue donde tiene que ser, entonces aparecerá el puntero fuera de la base entonces (convenciones de llamada a menudo se empuje el puntero base actual antes de cambiarlo, de modo que un pop sencillo se recuperará el valor anterior).

Otros consejos

Es un mov valor de 64 bits. Su 64 bits debido a la "q" en movq que es quad y quad es de 64 bits.

No puede ser otro ejemplo tal como movl en la que l es de 32 bits.

pero en el caso de movq (% RSP),% RSP utilizando la sintaxis ATT ..

El movq (% RSP),% RSP -.> Movq se llama código de operación, (% RSP) se denomina fuente o src y% RSP se llama el destino o el dst

lo que hace es que se ve en el registro% RSP toma su valor y se dirige a la memoria [el soporte "()" significa que entran en valor de la memoria] de ese valor y luego lo asigna a RSP%.

Si bien ambos son mismo registro la diferencia es que el valor de cambios% de RSP.

Por ejemplo: digamos% RSP tiene el valor 22. Pero el recuerdo de RSP% es 30.

El uso de este movq instrucción (% RSP),% RSP

el nuevo valor de% RSP es 30. Una vez más, porque (% RSP) obtiene el valor de% RSP, que es asumir 22 y luego (% RSP) se dirige al valor de la memoria 30 y luego lo asigna a RSP% sobre el destino , que es% RSP sí mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top