#include <iostream>
#include <cmath>

using namespace std;

struct Point {
    
  int x;  
  int y;
  
};


class Quad {

public:
    Quad(int x ,int y ,int w ,int h); 
    ~Quad() {}
    
    void opseg();
    void povrsina();
    void dijagonala();
    
protected:
    void init_ASM_DATA();

private:
    Point m_topLeft; 
    int   m_width;
    int   m_height;
    
    int data_ASM[4];            
};


Quad::Quad(int x ,int y ,int w ,int h)
{
    m_topLeft.x = x;
    m_topLeft.y = y;
    m_width = w;
    m_height = h;
    
    init_ASM_DATA();
}

void Quad::init_ASM_DATA()
{
    data_ASM[0] = m_topLeft.x; 
    data_ASM[1] = m_topLeft.y; 
    data_ASM[2] = m_width;
    data_ASM[3] = m_height;
}


void Quad::opseg()
{
    /*******FORMULA***************/    
    /* opseg = 2*width + 2*height*/
    /****************************/
    
    int res;
    
    __asm__(
        
        "movl %1 , %%esi        \n"       
        "movl 8(%%esi) , %0     \n"
        "addl 12(%%esi), %0     \n"
        "imull $2 , %0          \n"      
        : "=b" (res)               
        : "a"  (data_ASM)
        
        );
   
   cout<< "opseg: " << res << "\n";
}


void Quad::povrsina()
{
    /*******FORMULA***************/    
    /* width * height            */
    /****************************/
    
     int res;
    
    __asm__(
        
        "movl %1 , %%esi        \n"       
        "movl 8(%%esi) , %0     \n"
        "imull 12(%%esi), %0    \n"              
        : "=b" (res)               
        : "a"  (data_ASM)
        
        );
   
   cout<< "povrsina: " << res << "\n";
    
}



void Quad::dijagonala()
{
    /*******FORMULA***************/    
    /* sqrt(width^2 + height^2)  */
    /****************************/
    
     int res;
    
    __asm__(
        
        "movl %1 , %%esi        \n"       
        "movl 8(%%esi) , %0     \n"
        "imull %0 , %0          \n"
        "movl 12(%%esi) , %%ecx \n"
        "imull %%ecx , %%ecx    \n"
        "addl %%ecx , %0        \n"              
        : "=b" (res)       
        : "a"  (data_ASM)
        
        );
           
   cout<< "dijagonala: " << sqrt(res) << "\n";
    
}


int main() 
{
    int x , y , width , height;
    cout<< "unesi koordinate gornje lijeve točke(x,y)\n";
    cout<< ", sirinu i visinu pravokutnika\n";        
    cin>> x >> y >> width >> height; 
    
    int state;
    cout<< "\nbiraj\n";
    cout<< "3.Opseg pravokutinika\n";
    cout<< "2.Površina pravokutinka\n";
    cout<< "1.Opseg i površina pravokutinika\n";
    cout<< "0.Opseg,površina i duljina dijagonale\n\n\n";
    cin>> state;
    cout<< "\n";
    
    Quad pravokutnik(x , y , width , height);
    
    switch(state)
    {
        case 0: 
        {
          pravokutnik.dijagonala();  
        }
        
        case 1:
        {
            pravokutnik.opseg(); 
        }
        
        case 2:
        {
            pravokutnik.povrsina(); 
        }
        break;
        
        case 3:
        {
            pravokutnik.opseg(); 
        }
        break;       
    }
    
    
    	
	return 0;
}