assembly x86-64 att

assembly - función de montaje movq



x86-64 att (2)

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

Puede haber otro ejemplo como movl en el que l es de 32 bits.

pero en el caso de movq (% rsp),% rsp usando la sintaxis ATT ..

El movq (% rsp),% rsp -> movq se llama opcode, (% rsp) se llama source o src y% rsp se llama el destino o dst.

lo que hace es que busca en el registro% rsp obtiene su valor y va a la memoria [el corchete "() significa ir a la memoria] de ese valor y luego lo asigna a% rsp.

Mientras que ambos son el mismo registro, la diferencia es que el valor de% rsp cambia.

EG: digamos que% rsp tiene un valor 22. Pero la memoria de% rsp es 30.

Usando esta instrucción movq (% rsp),% rsp

el nuevo valor de% rsp es 30. Nuevamente porque (% rsp) obtiene el valor de% rsp que se supone que es 22 y luego (% rsp) va al valor de memoria 30 y luego lo asigna a% rsp en el destino, que es % rsp en sí.

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

movq (%rsp), %rsp


movq (suponiendo que esté hablando de x86) es un movimiento de una palabra cuádruple (valor de 64 bits). Esta instrucción particular:

movq (%rsp), %rsp

se parece mucho al código que se desplazará por los marcos de pila. Esta instrucción particular toma el quadword apuntado por el puntero de pila actual, y lo carga en el puntero de pila, sobrescribiéndolo.

A modo de ejemplo, esta secuencia de código (basada en el código real, y en Intel en lugar de en el formato AT&T) cargará continuamente el puntero de la pila desde su contenido hasta que el valor 16 bytes más allá de este sea 0.

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

Es posible que no sea un código de apilamiento de fotogramas de la pila, pero es inusual, ya que estaría subyuntando el puntero de la pila a algo para lo que no se usa normalmente.

Es inusual ya que subir los cuadros de la pila generalmente involucra el puntero de la pila y el puntero de la base, pero eso generalmente es solo para subir un nivel (es decir, un retorno de una función).

Para el tipo de código que se muestra arriba donde quiere subir múltiples niveles, es probable que sea más rápido simplemente usar el puntero de la pila hasta que llegue a donde necesita estar, luego retire el puntero de la base (las convenciones de llamadas a menudo empujarán la base actual) puntero antes de cambiarlo, para que un simple pop recupere el valor anterior).