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?
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ónmovq
para operandos de 64 bits omovl
para operandos de 32 bits.Para solucionar el problema, cambia todas las instancias de
mov
pormovq
omovl
según corresponda. Por ejemplo, cambia:a:
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
agcc
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.