Está en la página 1de 8

Fecha: 19 de abr de 2023

Actividad 6

Nombre: Diego Arturo Herrera Álvarez 217450735


Asignatura: Traductores de lenguaje 1
Profesor: Meza Espinosa, José Juán
Sección: D05
Ciclo Escolar: 2023 A
Desarrollo:
Función de suma y resta con C y ASM.

Función GCD y SUB.

2
Función NUEVA: multiplicación de 3 números.

A la función se le pasan 3 números enteros, estos son asignados a “ax”, “bx” y “cx”
para después multiplicar dichas direcciones con la instrucción imull. Después el
resultado almacenado en “ax” pasa a $result.

Solicitud del tercer número e impresión de resultado.

Código:

#include <iostream>
using namespace std;
int suma( int $a, int $b )
{
int $result;

3
__asm__ __volatile__(
"movl %1, %%eax;"
"movl %2, %%ebx;"
"addl %%ebx,%%eax;"
"movl %%eax, %0;" : "=g" ( $result ) : "g" ( $a ), "g" ( $b ));
return $result ;
}
int resta( int $a, int $b )
{
int $result;
__asm__ __volatile__(
"movl %1, %%eax;"
"movl %2, %%ebx;"
"subl %%ebx,%%eax;"
"movl %%eax, %0;" : "=g" ( $result ) : "g" ( $a ), "g" ( $b ));
return $result ;
}

int gcd( int $a, int $b )


{
int $result;
__asm__ __volatile__(
"movl %1, %%eax;"
"movl %2, %%ebx;"
"CONTD: cmpl $0, %%ebx;"
"je DONE;"
"xorl %%edx, %%edx;"
"idivl %%ebx;"
"movl %%ebx, %%eax;"
"movl %%edx, %%ebx;"

4
"jmp CONTD;"
"DONE: movl %%eax, %0;" : "=g" ( $result ) : "g" ( $a ), "g" ( $b ));
return $result ;
}

int sub(int x, int y){


return x - y;
}

int multiplica( int $a, int $b, int $c )


{
int $result;
__asm__ __volatile__(
"movl %1, %%eax;"
"movl %2, %%ebx;"
"movl %3, %%ecx;"
"imull %%ebx, %%eax;"
"imull %%ecx, %%eax;"

"movl %%eax, %0;" : "=g" ( $result ) : "g" ( $a ), "g" ( $b ), "g" ($c));


return $result ;
}

int main(int argc, char** argv) {


int a, b, c, d;
cout<<"\nDigite el numero a: ";
cin>>a;

5
cout<<"\nDigite el numero b: ";
cin>>b;
c=suma(a,b);
cout<<"\nEl resultado de la suma de "<<a<<"+"<<b<<"="<<c<<"\n";
c=resta(a,b);
cout<<"\nEl resultado de la resta de "<<a<<"-"<<b<<"="<<c<<"\n";
c=gcd(a,b);
cout<<"\nEl resultado GCD("<<a<<","<<b<<")="<<c<<"\n";

asm("subl %%ebx, %%eax;"


"movl %%eax, %%ecx;"
: "=c" (c)
: "a" (a), "b" (b)
: /* lista clobber vacia */
);

printf("a = %d\nb = %d\nc = %d\n", a, b, c);

asm("addl %%ebx, %%eax;"


"movl %%eax, %%ecx;"
: "=c" (c)
: "a" (a), "b" (b)
: /* lista clobber vacia */
);

printf("a = %d\nb = %d\nc = %d\n", a, b, c);


/*La lista clobber es una lista de cadenas separadas por comas.
Cada cadena es el nombre de un registro que el código ensamblador
modifica potencialmente, pero para el cual el valor
final no es importante. */

6
cout<<"\nDigite el numero c: ";
cin>>c;
d=multiplica(a,b,c);
cout<<"\nEl resultado de la multiplicacion
("<<a<<"*"<<b<<"*"<<c<<")="<<d<<"\n";

return 0;
}
Pantallazos:
Solicitud de los números al usuario.

Impresión de funciones dadas por el profesor y solicitud de tercer dato.

7
Impresión del resultado de la multiplicación.

Conclusión:
El propósito de esta actividad era conocer la combinación del lenguaje ensamblador
y lenguajes de alto nivel como lo son C y C++ además de saber implementar dichas
instrucciones. Me parece que dicho objetivo se cumplió, se como usar instrucciones
del lenguaje ensamblador dentro de C además de las direcciones de memoria que
son las mismas usadas en el emu8086 aunque no termino de entender por qué
alguien preferiría usar estas instrucciones ya teniéndolas en el mismo lenguaje de
una forma más sencilla, pero lo importante es saber cómo funcionan dichas
operaciones que realiza el lenguaje de alto nivel.

Bibliografía:
http://arantxa.ii.uam.es/~gdrivera/labetcii/curso0001/udigxiii.htm
(consultado el 19 de abril de 2023).

También podría gustarte