Como sabemos, C++ es un lenguaje de programación completo y poderoso, pero hay pocas situaciones altamente especializadas que no puede manejar. Para esas situaciones, C++ proporciona una opción mediante la cual se puede colocar un código ensamblador en cualquier momento. Esta opción es el uso de la instrucción ‘asm’. Usando la declaración asm, el lenguaje ensamblador se puede incrustar directamente en el programa C++. La palabra clave asm toma un solo campo que debe ser una string literal.
La forma general de la palabra clave asm es:
asm("op-code");
código de operación : esta es una instrucción en lenguaje ensamblador que se incluirá en el programa.
Algunos de los compiladores usan la siguiente forma de declaración asm:
asm instruction; asm instruction newline asm {instruction sequence }
Algunas sintaxis de ensamblaje en línea de GCC son las siguientes:
- Nombre de registro: los nombres de registro tienen el prefijo %.
Por ejemplo, los registros son %eax, %cl, etc., en lugar de solo eax, cl.#include<bits/stdc++.h>
using
namespace
std;
int
main() {
int
res;
// move value to register %eax
// move value to register %ebx
// subtracting and storing result in res
__asm__ (
"movl $20, %%eax;"
"movl $10, %%ebx;"
"subl %%ebx, %%eax "
:
"=a"
(res));
cout<<res;
return
0;
}
Producción:10
- Ordenación de los operandos: a diferencia de la convención de Intel (el primer operando es el destino), el orden de los operandos es la(s) fuente(s) primero y el destino al final.
Por ejemplo, la sintaxis de Intel «mov eax, edx» se verá como «mov %edx, %eax» en el ensamblaje de AT&T.#include<bits/stdc++.h>
using
namespace
std;
int
main() {
int
res;
// source 5 is written first
// then destination register is written
// this will move 5 to register
__asm__ (
"movl $5, %%eax;"
:
"=a"
(res));
cout<<res;
return
0;
}
Producción:5
- Operando inmediato: los operandos inmediatos se marcan con un prefijo $. Por ejemplo, como en «addl $5, %eax», lo que significa agregar el valor largo inmediato 5 para registrar %eax.
#include<bits/stdc++.h>
using
namespace
std;
int
main() {
int
res;
// move immediate value 50 to register eax
// move immediate value 20 to register ebx
// the added value is stored in res for output
__asm__ (
"movl $50, %%eax;"
"movl $20, %%ebx;"
"addl %%ebx, %%eax "
:
"=a"
(res));
cout<<res;
return
0;
}
Producción:70
Básicamente, esto muestra el uso del ensamblado en línea en C++. El término en línea se usa para indicar al compilador que inserte el código de una función en el código de su llamador en el punto donde se realiza la llamada real. Estas funciones se denominan «funciones en línea». Reduce la sobrecarga de la llamada a la función. Usando la palabra clave asm, los códigos ensambladores se escriben como funciones en línea.
Ejemplo simple de uso de palabras clave asm:
#include<bits/stdc++.h> using namespace std; int main() { // generates interrupt 5 asm int 5; return 0; }
Cuando se ejecuta bajo DOS, este programa genera una instrucción INT 5, que invoca la función de impresión de pantalla.
El ensamblaje en línea se puede utilizar en los siguientes dos formatos:
asm("assembly code") or __asm__("assembly code")
Programa para ilustrar el uso de la palabra clave asm:
#include<bits/stdc++.h> using namespace std; int main() { int val1,val2, add, sub, mul; val1=100;val2=20; asm( "addl %%ebx, %%eax;" : "=a" (add) : "a" (val1) , "b" (val2) ); asm( "subl %%ebx, %%eax;" : "=a" (sub) : "a" (val1) , "b" (val2) ); asm( "imull %%ebx, %%eax;" : "=a" (mul) : "a" (val1) , "b" (val2) ); printf( "%d + %d = %d\n ", val1, val2, add ); printf( "%d - %d = %d ", val1,val2, sub ); printf( "%d * %d = %d ", val1, val2, mul ); return 0; }
100 + 20 = 120 100 - 20 = 80 100 * 20 = 2000
Ejemplos:
Input : 10 20 Output :10+20=30 10-20=-10 10*20=200 Input : 30 20 Output :30+20=50 30-20=10 30*20=600
El programa anterior realiza la operación de suma, resta y multiplicación utilizando el ensamblaje en línea con la ayuda de la palabra clave asm.
Publicación traducida automáticamente
Artículo escrito por Somil_singh y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA