Advertisement
Guest User

Untitled

a guest
Feb 3rd, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 2016-09-20
  2.  
  3. #include <iostream>
  4. using namespace std;
  5. struct st1 { char vc[4]; }; struct st2 { int vd[4]; };
  6. class cl
  7. {   st1 s; long v[4];
  8. public:
  9.     cl(char c, st2& s2);
  10.     void elab1(st1 s1, st2 s2);
  11.     void stampa()
  12.     {   int i;
  13.         for (i=0;i<4;i++) cout << s.vc[i] << ' '; cout << endl;
  14.         for (i=0;i<4;i++) cout << v[i] << ' '; cout << endl << endl;
  15.     }
  16. };
  17.  
  18.  
  19. #include "cc.h"
  20. cl::cl(char c, st2& s2) {
  21.     for (int i = 0; i < 4; i++) {
  22.         s.vc[i] = c + i;
  23.         v[i] = s2.vd[i] + s.vc[i];
  24.     }
  25. }
  26. void cl::elab1(st1 s1, st2 s2) {
  27.     cl cla('a', s2);
  28.     for (int i = 0; i < 4; i++) {
  29.         if (s.vc[i] <= s1.vc[i]) {
  30.             s.vc[i] = cla.s.vc[i];
  31.             v[i] = cla.v[i];
  32.         }
  33.     }
  34. }
  35.  
  36.  
  37. SOLUZIONE
  38.  
  39. # COSTRUTTORE
  40.  
  41. .global _ZN2clC1EcR3st2
  42.  
  43. _ZN2clC1EcR3st2:
  44.  
  45.   # RECORD DI ATTIVAZIONE
  46.  #  st2& s2    -24
  47.  # i   |   c     -16
  48.  # this    -8
  49.  # %old_rbp  <-    %rbp
  50.  # %rip
  51.  
  52.   # PROLOGO
  53.     pushq %rbp
  54.     movq %rsp,    %rbp
  55.     subq $24,   %rsp
  56.  
  57.   # COPIA PARAMETRI
  58.  
  59.     movq %rdi,    -8(%rbp)
  60.     movb %sil,    -16(%rbp)       #char c è il primo parametro della funzione quindi è il primo
  61.                                        #ad essere passato dopo l°oggetto classe. SIL-SI-ESI_RSI
  62.     movq %rdx,    -24(%rbp)
  63.  
  64.   # CORPO
  65.  
  66.     movl $0,    -12(%rbp)         # i = 0
  67.     movq -8(%rbp),    %rdi       # this oggetto classe
  68. for:
  69.     cmpl $4,    -12(%rbp)
  70.     jge finefor
  71.     movslq -12(%rbp),   %rcx     # estendo i su q (8 byte = 64 bit) per indirizzamento
  72.     movb -16(%rbp),   %al        # salvo c in al
  73.     addb %cl,   %al              # AL = AL + CL, al = c e cl è la parte meno significativa
  74.                                      # di rcx dove ho salvato i. Quindi in al ho i + c
  75.                                      # char è su 8 bit (reg %AL) per sommargli un intero
  76.                                      # devo effettuare il cast int -> prendo parte meno
  77.                                      # significativa del reg in cui è salvato l°int.
  78.     movb %al, (%rdi, %rcx)       # metto (i+c) in s.vc[i], s è il primo elemento dell° oggetto
  79.                                      # classe quindi non devo aggiungere niente, solo reg
  80.                                      # ogg classe e %rcx == i per indirizzamento
  81.     movq -24(%rbp),     %r8
  82.     movslq (%r8, %rcx, 4), %r9        # s2.vd[i]
  83.     movsbq (%rdi, %rcx),  %rbx         #s.vc[i]
  84.     addq %rbx,    %r9
  85.     movq %r9,   8(%rdi, %rcx, 8)      # v[i] = s.vc[i] + s2.vd[i]
  86.     incl -12(%rbp);
  87.     jmp for
  88. finefor:
  89.     leave
  90.     ret
  91.  
  92. # elab1
  93.  
  94. .global _ZN2cl5elab1E3st13st2
  95.  
  96. _ZN2cl5elab1E3st13st2:
  97.  
  98.   # RECORD DI ATTIVAZIONE
  99.  # cla   -72     <- cla          #cla = st1 s (che è un array di 4 char quindi occupa 4*1 byte => 4byte) e long v[4] che è un array di 4 long e quindi occupa 8*4 = 32 byte. quindi in totale cl cla è di 32+4 byte = 36 byte, allineati a multiplo di 8: 40 byte
  100.  # cla   -64
  101.  # cla   -56
  102.  # cla   -48
  103.  # cla   -40
  104.  # s2    -32     <-  s2  parte meno significativa
  105.  # s2    -24
  106.  # i   |   s1 -16
  107.  # this    -8
  108.  # %old_rbp      <-    %rbp
  109.  # %rip
  110.  
  111.   # PROLOGO
  112.     pushq %rbp
  113.     movq %rsp,    %rbp
  114.     subq $72,   %rsp
  115.  
  116.   # COPIA PARAMETRI
  117.     movq %rdi,    -8(%rbp)        # this, oggetto classe
  118.     movl %esi,    -16(%rbp)       # s1
  119.     movq %rdx,    -32(%rbp)       # parte meno significativa di s2
  120.     movq %rcx,    -24(%rbp)       # parte più significativa di s2
  121.  
  122.   # CREAZIONE cla
  123.     leaq -71(%rbp),   %rdi        # inserisco nel reg rdi la posizione in cui deve essere creato l°oggetto cioè -72(%rbp)
  124.     movb $'a',  %sil
  125.     leaq -32(%rbp),   %rdx        # metto con lea perchè nel costruttore il parametro è passato come riferimento
  126.     call _ZN2clC1EcR3st2
  127.  
  128.   # FOR
  129.     movl $0,    -12(%rbp)
  130.     movq -8(%rbp),    %rdi
  131. for1:
  132.     cmpl $4,    -12(%rbp)
  133.     jge finefor1
  134.     movslq -12(%rbp),   %rcx            # converto i da 'l' a 'q' per indicizzazione
  135. if:
  136.     movb (%rdi, %rcx), %sil             # s.vc[i]
  137.     cmpb -16(%rbp, %rcx), %sil          # se s.vc[i] è maggiore di s1.vc[i] allora salta a fineif
  138.     jge fineif
  139.     movb -72(%rbp, %rcx),   %al         #cla.s.vc[i]
  140.     movb %al,   (%rdi, %rcx)            #s.vc[i] = cla.s.vc[i]
  141.     movq -64(%rbp, %rcx, 8),    %rax    # cla.v[i]
  142.     movq %rax,    8(%rdi, %rcx, 8)      # s.v[i] = cla.v[i]
  143. fineif:
  144.     incl -12(%rbp)
  145.     jmp for1
  146. finefor1:
  147.     leave
  148.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement