Advertisement
AntonioVillanueva

Ejercicio 3.1 del libro Lenguaje Ensamblador version+

Jan 27th, 2016
233
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. //Ejercicio 3.1 del libro Lenguaje Ensamblador de Anaya con sintaxis AT&T
  2. //Antonio Villanueva Segura
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. int main(){
  7.     struct Incidencia{
  8.         char Carretera[8];
  9.         short Kilometro;
  10.         char Descripcion[128];
  11.     };
  12.    
  13.     Incidencia hoy[]={
  14.         {"A44",32,"Nieve"},
  15.         {"A6",173,"Accidente"},
  16.         {"M30",8,"Retenciones"}                    
  17.     };
  18.     int size=sizeof (Incidencia);
  19.     char *via,*problema;
  20.     int kilometro(0);
  21.     int linea(0);
  22.  
  23.    for (linea;linea<3;linea++){
  24.         asm (
  25.        
  26.  /* OJO  con los registros r = 64bits e= 32bits p.e rax en 64 y eax para 32 bits !!!!!!*/
  27.  
  28.             "imul %[linea],%[size] \n\t"/*selecciona la linea de la estructura */
  29.             "mov %[size],%%esi \n\t "/* %rsi  tiene tamano de la struct incidencia */  
  30.  
  31.             "lea (%[hoy]),%%ebx \n\t" /* direccion de hoy en rbx o ebx */
  32.        
  33.             /*recupero el puntero a carretera */
  34.             "lea (%%ebx,%%esi,),%%eax \n\t" /*load effective address de %%rbx+%%rsi en %%rax o eax*/
  35.             "mov %%eax,%[via] \n\t"
  36.             /*recupero el valor del kilometro */
  37.             "mov 8(%%ebx,%%esi,),%%ax \n\t"
  38.             "and $255 ,%%eax\n\t"/* solo utilizo los dos bytes inferiores 0xFF*/
  39.             "mov %%eax,%[km] \n\t"
  40.             /*recupero el puntero al problema */
  41.             "lea 10(%%ebx,%%esi,),%%eax \n\t" /*load effective address de %%rbx+%%rsi en %%rax*/
  42.             "mov %%eax,%[problema] \n\t"
  43.  
  44.             /*asignacion de registros entrada ,salida */
  45.             :[km]"=g" (kilometro) ,[via]"=r" (via),[problema]"=r" (problema) /* %0 kilometro %1 via %2 problema *salidas*/
  46.             :[hoy]"r"(hoy) ,[size]"r" (size),[linea]"r" (linea) /* %3=hoy %4=size      entradas*/
  47.         );
  48.  
  49.         cout <<"Problema "<<problema<<" a la altura del km "<<kilometro<<" en la "<<via<<endl;
  50.     }
  51.  
  52. return 0;
  53. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement