es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Instrucción no compatible `mov`.

Estoy estudiando sobre código básico de shell con código orw.
Pero, en el proceso, he obtenido este mensaje de error:

Error: instrucción no compatible mov

Este es mi código esqueleto en C y ensamblador:

// Nombre del archivo: orw.c
// Compilar: gcc -o orw orw.c -masm=intel

<strong>asm</strong>(

<pre><code>"global run_sh\n"
"run_sh:\n"

"push 0x67\n"
"mov rax, 0x616c662f706d742f \n"
"push rax\n"
"mov rdi, rsp\n"
"xor rsi, rsi\n"
"xor rdx, rdx\n"
"xor eax, eax\n"
"mov eax, 2\n"
"syscall"
"\n"
"mov rdi, eax\n"
"mov rsi, rsp\n"
"sub rsi, 0x30\n"
"mov rdx, 0x30\n"
"xor eax, eax\n"
"syscall"
"\n"
"mov rdi,1\n"
"mov eax,1\n"
"syscall" 
</code></pre>

);

void run_sh();

int main() { run_sh(); }

He puesto movq y movl pero no funcionaron.

¿Por qué ocurre este problema con mi código?
¿Cuál es la solución?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema es que mov no es una instrucción compatible con la sintaxis AT&T, que es la que el ensamblador GNU está utilizando de forma predeterminada. En su lugar, debes utilizar la instrucción movq para operandos de 64 bits o movl para operandos de 32 bits.

    Para solucionar el problema, cambia todas las instancias de mov por movq o movl según corresponda. Por ejemplo, cambia:

    mov rax, 0x616c662f706d742f
    

    a:

    movq $0x616c662f706d742f, %rax
    

    Además, parece que estás utilizando la sintaxis de Intel en tu código de ensamblador, pero estás intentando compilarlo con el ensamblador GNU. Si deseas utilizar la sintaxis de Intel, puedes agregar la bandera -masm=intel a gcc al compilar tu código. Alternativamente, puedes cambiar a utilizar la sintaxis AT&T.

    Una vez que hayas realizado estos cambios, tu código debería compilar sin errores.

Comments are closed.