Pregunta:
¿Cuál es el significado de movabs en la sintaxis de AT&T gas / x86?
perror
2013-08-12 21:00:51 UTC
view on stackexchange narkive permalink

Acabo de encontrar una instrucción extraña al ensamblar (con gas ) y desensamblar (con objdump ) en una arquitectura amd64 .

El código ensamblador amd64 original es:

  mov 0x89abcdef,% al  

Y, después de gas lo compiló (estoy usando la siguiente línea de comando: gcc -m64 -march = i686 -c -o myobjectfile myassemblycode.s ), objdump da el siguiente código:

  a0 df ce ab 89 00 00 movabs 0x89abcdef,% al  

Mi problema es que no puedo encontrar ningún movabs , ni movab en el manual de ensamblaje de Intel (ni siquiera una instrucción mova ).

Entonces, ¿estoy soñando? ¿Cuál es el significado de esta instrucción? Supongo que es una peculiaridad de GNU binutils, pero no estoy seguro.

PD: Verifiqué con precisión la ortografía de esta instrucción, por lo que NO es un movaps código> instrucción seguro.

Creo que los primeros 5 bytes son `a0 ef cd ab 89`, no` a0 df ce ab 89`
http://stackoverflow.com/questions/19415184/load-from-a-64-bit-address-into-other-register-than-rax
Consulte también [¿Cuándo se introdujo la instrucción MOVABS?] (Http://reverseengineering.stackexchange.com/q/6540/5853)
Cuatro respuestas:
#1
+25
0xC0000022L
2013-08-12 22:32:13 UTC
view on stackexchange narkive permalink

Aquí está la documentación oficial para gas , citando la sección relevante:

En la sintaxis AT&T, el tamaño de los operandos de memoria se determina a partir de el último carácter de la instrucción mnemotécnica. Los sufijos mnemónicos de b , w , l y q especifican byte (8 bits), palabra (16- bit), referencias de memoria largas (32 bits) y cuádruples (64 bits). La sintaxis Intel logra esto prefijando operandos de memoria (no los mnemónicos de instrucción) con byte ptr , word ptr , dword ptr y qword ptr . Por lo tanto, Intel mov al, byte ptr foo es movb foo,% al en la sintaxis AT&T.

En código de 64 bits, movabs se puede utilizar para codificar la instrucción mov con el desplazamiento de 64 bits o el operando inmediato.

Lea especialmente la última oración.

Nota: Encontrado a través del operador de Google inurl , buscando movabs inurl: sourceware.org/binutils/ .

Miré el manual del gas pero no encontré la sección correcta. ¡Muchas gracias 0xC0000022L! :-)
¿Cómo se puede mover un número de 32 bits a al?
@LưuVĩnhPhúc: bueno, solo puedes con pérdidas, pero esto no tiene nada que ver con mi respuesta o la pregunta, así que será mejor que la hagas como una nueva pregunta.
Lo que es interesante, gdb me da `48 b8 ` bytes como `movabs rax, ` incluso en `desensamblaje-sabor = intel`.
#2
+8
ekse
2013-08-12 22:35:35 UTC
view on stackexchange narkive permalink

movabs se usa para movimientos de datos absolutos, ya sea para cargar una constante arbitraria de 64 bits en un registro o para cargar datos en un registro desde una dirección de 64 bits.

Fuente: http : //www.ucw.cz/~hubicka/papers/amd64/node1.html

#3
+6
Igor Skochinsky
2013-08-13 02:59:46 UTC
view on stackexchange narkive permalink

Si a menudo descifra la sintaxis del ensamblador x86 / x64 de AT&T, los manuales de Solaris pueden ser de ayuda: Manual de referencia del lenguaje ensamblador x86.

buena referencia descargable gracias igorsk por el enlace
#4
+3
kyoungson jhang
2016-10-14 05:33:39 UTC
view on stackexchange narkive permalink

Noté que GAS se traduce

  movq $ 0x80000000,% rax  

a

  movabs 0x80000000,% rax  

Pero los valores menores que 0x80000000 el movimiento no se traduce a movabs . Es decir, movq $ 0x7fffffff, $ rbx NO se traduce en movabs $ 0x7fffffff,% rbx . Puede verificar con el comando de desensamblaje dese dentro de GDB.

Quizás la razón es que $ 0x80000000 está por encima del rango de números positivos con signo de 32 bits y necesita para ser traducido a un entero de 64 bits. Por esta razón, GAS traduce un número mayor en un entero de 64 bits y, por lo tanto, usa la instrucción movabsq en lugar de la instrucción movq cuya fuente inmediata está limitada a una constante de 32 bits.

esto es incorrecto `movq $ 0x80000000,% rax` mueve el 0x80000000 inmediato a rax mientras que` movabs 0x80000000,% rax` carga la palabra cuádruple en la dirección 0x80000000 a rax


Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...