2012-02-10 26 views
23

¿Qué quiere decir la siguiente línea:¿Qué significa un asterisco * antes de una dirección en el ensamblaje AT & T x86-64?

... 
401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8) 
... 

¿Qué significa el asterisco en frente de la dirección de memoria? Además, ¿qué significa cuando falta el método de acceso a memoria es su primer valor de registro?

Suele ser algo así como ("% register",% rax, 8), pero en este caso no tiene el primer registro.

¿Algún consejo?

+3

lol, pero tengo que saberlo para poder depurar algún código c. y también para exámenes de clase. – de1337ed

Respuesta

4

Es un salto a una dirección contenida en la memoria. La dirección se almacena en la memoria en la dirección rax*8+0x402680, donde rax es el valor actual de rax (cuando se ejecuta esta instrucción).

14

hacer las cosas en la sintaxis de Intel siempre hace las cosas más claras:

FF24C5 80264000 JMP QWORD PTR [RAX*8+402680] 
+0

quien haya votado, ¿quiere explicar por qué? El simple hecho de ser una sintaxis anti-intel * no * es una razón ... – Necrolis

+17

No he votado negativamente, pero no estás explicando exactamente lo que está sucediendo ... –

+3

@MichaelFoukarakis: aparte de repetir las actas textuales de matemáticas en inglés, no hay mucho para agregar realmente cuando se utiliza la sintaxis de Intel. – Necrolis

14

Es en & T sintaxis de montaje:

  • fuente viene antes que el destino
  • sufijos mnemotécnicos indican el tamaño de los operandos (q para quad, etc.)
  • los registros tienen el prefijo % y valores inmediatos con $
  • direcciones efectivas son en forma DISP(BASE, INDEX, SCALE) (DISP + base + índice * ESCALA)
  • salto absoluto/call operandos indicados con * (en contraposición a IP relativa)

Por lo tanto, tiene un jmpq para saltar a la dirección absoluta que está almacenada en %rax * 8 + 0x402680, y es una palabra cuádruple larga.

+0

pero, ¿los asteriscos delante de él hacen la diferencia? Entiendo que lo que dijiste tiene sentido de lo contrario. Estaba pensando que primero el asterisco sacará los datos de la ubicación de la memoria 0x402680. Así que, básicamente, se convertirá en% rax * 8 + mem [0x402680] – de1337ed

+0

El asterisco solo especifica que se trata de un salto absoluto. 'jmp' sacará los datos de la ubicación de memoria especificada independientemente. –

17

Actualmente es tabla calculada jmp, donde 0x402680 es dirección de tabele y rax es índice de 8 byte (qword) pointer.

+3

Las tablas de salto a menudo se utilizan en el código de ensamblaje cuando el código C completa las sentencias if-else o switch. Permite que el control se transmita en tiempo constante, en lugar de tener que verificar muchas verificaciones de igualdad individuales. – Eagle

4

Como escribió Necrolis, la sintaxis de Intel lo hace un poco más obvio, pero RTN es realmente más claro. La línea

jmpq *0x402680(,%rax,8) 

se describe en RTN por:

RIP <- M[0x402680 + (8 * RAX)] 

donde M es la memoria del sistema.

Como tal, se puede escribir la forma general jmpq *c(r1, r2, k), donde c es una constante inmediata, r1 y r2 son registros de propósito general y k es o bien 1 (por defecto), 2, 4 o 8:

RIP <- M[c + r1 + (k * r2)] 
4

jmpq es solo un salto no condicional a una dirección determinada. La 'q' significa que estamos tratando con palabras cuádruples (64 bits de largo).

*0x402680(,%rax,8): Esta es una forma de escribir una dirección en el ensamblaje x-86. Tiene razón al decir que generalmente hay un registro antes de la primera coma, pero aún sigue las mismas reglas si no se especifica ningún registro.

El formato funciona de esta manera: D(reg1, reg2, scalingFactor) donde D significa desplazamiento. El desplazamiento es básicamente solo un número entero. reg1 es el primer o base de registro. reg2 es el segundo registro y scalingFactor es uno de 2, 4, 8 (tal vez incluso 1, pero no estoy seguro de eso). Ahora, puede obtener su dirección simplemente agregando los valores de esta manera: Desplazamiento + (valor en reg1) + scalingFactor * (valor en reg2).

No estoy seguro del significado del asterisco delante de la dirección, pero supongo que significa que el valor de desplazamiento se almacena en esa dirección.

Espero que esto ayude.

1

ejemplo Mínimo para hacer las cosas más claras:

.data 
    # Store he address of the label in the data section. 
    symbol: .int label 
.text 
    # Jumps to label. 
    jmp *symbol 
    label: 

Sin la *, sería saltar a la dirección de symbol en la sección .data y la violación de segmento.

me siento esta sintaxis es un poco inconsistente, ya que para la mayoría de las instrucciones:

mov symbol, %eax 
mov label, %eax 

ya mueve sus datos en la dirección symbol y $symbol se usa para la dirección. La sintaxis de Intel es más consistente en este punto, ya que siempre usa [] para la desreferencia.

La * es, por supuesto, una mnemotécnica para el operador de desreferencia C *ptr.

Cuestiones relacionadas