Advertisement
Guest User

Untitled

a guest
Oct 6th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. _Z6Memberid:                                            // метка функции double Member
  2.         pushq   %rbp                                    // помещает указатель базы в стек
  3.         movq    %rsp, %rbp                              // копирует значение указателя стека в указатель базы                                        
  4.         movl    %edi, -20(%rbp)                         // значение параметра int n передаётся на стек по адресу (%rbp) - 20
  5.         movsd   %xmm0, -32(%rbp)                        // значение параметра double x передаётся на стек по адресу (%rbp) - 32
  6.         movsd   .LC0(%rip), %xmm0                       // читает константу(double res) по метке .LC0 и кладёт её в регистр %xmm0 (%rip содержит адрес след. ком.)
  7.         movsd   %xmm0, -8(%rbp)                         // записывает константу в ячейку стека с адресом (%rbp) - 8
  8.         movsd   .LC0(%rip), %xmm0                       // снова читает константу по метке .LCO (int i) и кладёт её в регистр %xmm0
  9.         movsd   %xmm0, -16(%rbp)                        // записывает константу в ячейку стека с адресом (%rbp) - 16
  10. .L4:                                                    // метка .L4 (инициализация цикла for в ф-ции double Member)
  11.         pxor    %xmm0, %xmm0                            // зануляет значение в %xmm0
  12.         cvtsi2sd        -20(%rbp), %xmm0                // конвентирует int n в double для сравнения затем его с double i
  13.         ucomisd -16(%rbp), %xmm0                        // производит неупорядоченное сравнение скалярных значений двойной точности с плав. запятой (i и n) + выставление EFLAGS
  14.         jb      .L7                                     // условный переход по метке .L7 выполняется при n < i (сравнение второго операнда с 1)
  15.         movsd   -32(%rbp), %xmm0                        // копирует значение double x в %xmm0
  16.         divsd   -16(%rbp), %xmm0                        // происходит деление double x на double i (результат остаётся во 2 операнде(%xmm0))
  17.         movsd   -8(%rbp), %xmm1                         // double res копирует в регистр %xmm1
  18.         mulsd   %xmm1, %xmm0                            // умножает double res на результат деления и помещает результат в %xmm0
  19.         movsd   %xmm0, -8(%rbp)                         // копирует получившееся значение на стек по адресу (%rbp) - 8
  20.         movsd   -16(%rbp), %xmm1                        // копирует int i со стека и кладём значение в регистр %xmm1
  21.         movsd   .LC0(%rip), %xmm0                       // читает константу double i по метке .LC0 и копирует её в регистр %xmm0 (%rip указывает на адрес следующей инструкции)
  22.         addsd   %xmm1, %xmm0                            // складывает значения в %xmm0 и %xmm1 (результат (i++) в %xmm0)
  23.         movsd   %xmm0, -16(%rbp)                        // новое значение i кладётся в ячейку стека с адресом (%rbp) - 16
  24.         jmp     .L4                                     // производит безусловный переход опять к началу цикла for
  25. .L7:                                                    // метка .L7
  26.         movsd   -8(%rbp), %xmm0                         // значение double res записывается в %xmm0
  27.         popq    %rbp                                    // достаём базу стека
  28.         ret                                             // возвращаем res
  29. _Z6sin_hyid:                                            // метка функции sin_hy
  30.         pushq   %rbp                                    // помещает в стек указатель его базы
  31.         movq    %rsp, %rbp                              // копирует значение указателя стека в указатель базы
  32.         subq    $56, %rsp                               // отнимает от значения stack pointer 56 и сохраняет результат в %rsp
  33.         movl    %edi, -36(%rbp)                         // значение параметра int n передаётся на стек по адресу (%rbp) - 36
  34.         movsd   %xmm0, -48(%rbp)                        // значение параметра double x передаётся на стек по адресу (%rbp) - 48
  35.         pxor    %xmm0, %xmm0                            // зануляет значение в регистре %xmm0
  36.         movsd   %xmm0, -8(%rbp)                         // копирует значение double sin x в стек по адресу (%rbp) - 8
  37.         movl    $0, -12(%rbp)                           // копирует значение j = 0 в стек по адресу (%rbp) - 12
  38. .L11:                                                   // метка .L11
  39.         movl    -12(%rbp), %eax                         // копирует значение параметра int j из стека в регистр %eax
  40.         cmpl    -36(%rbp), %eax                         // производит сравнение int j с int n
  41.         jg      .L9                                     // условный переход на метку .L9 при j > n
  42.         movl    -12(%rbp), %eax                         // копирует значение int j в регистр %eax    
  43.         addl    %eax, %eax                              // складывает int j с самим собой и записывает результат в %eax (2 * j)
  44.         leal    1(%rax), %edx                           // запишет в %edx значение %rax + 1 (2 * j + 1)
  45.         movq    -48(%rbp), %rax                         // копирует значение double x в регистр %rax
  46.         movq    %rax, -56(%rbp)                         // копирует значение double x обратно на стек по адресу (%rbp) - 56
  47.         movsd   -56(%rbp), %xmm0                        // копирует двойное слово из (%rbp) - 56 (double x) в %xmm0
  48.         movl    %edx, %edi                              // копирует значение в регистре %edx (2 * j + 1) и помещает его в %edi (1 аргумент функции при передаче)
  49.         call    _Z6Memberid                             // вызывает функцию double Member
  50.         movq    %xmm0, %rax                             // копирует результат работы ф-ции double Member (double tmp) из %xmm0 в %rax
  51.         movq    %rax, -24(%rbp)                         // копирует double tmp из %rax на стек по адресу (%rbp) - 24
  52.         movl    -12(%rbp), %eax                         // копирует int j и помещает его в регистр %eax
  53.         andl    $1, %eax                                // производит побитовое сравнение двоичного представления числа int j в %eax с 1, пишет результат в %eax
  54.         testl   %eax, %eax                              // 0 & 0 = 0 или 1 & 1 = 1 и выставление флагов без записи результата
  55.         je      .L10                                    // условный переход на метку .L10 при %eax & %eax = 0
  56.         movsd   -24(%rbp), %xmm1                        // копирует double tmp со стека в регистр %xmm1
  57.         movsd   .LC2(%rip), %xmm0                       // читает константу по метке .LC2 и помещает в регистр %xmm0 (-0) (знаковый 0)
  58.         xorpd   %xmm1, %xmm0                            // логическое "исключающее или" для двоичного представления числа double tmp c -0 меняет знак на противоположный
  59.         movsd   %xmm0, -24(%rbp)                        // копирует результат предыдущего шага (double tmp) на стек по адресу (%rbp) - 24
  60. .L10:                                                   // метка .L10
  61.         movsd   -8(%rbp), %xmm0                         // копирует значение double sinx со стека в регистр %xmm0
  62.         addsd   -24(%rbp), %xmm0                        // прибавляет к double sinx значение double tmp и записывает результат обратно в double sinx (регистр %xmm0)
  63.         movsd   %xmm0, -8(%rbp)                         // кладёт значение double sinx в стек по адресу (%rbp) - 8
  64.         addl    $1, -12(%rbp)                           // инкрементирует значение j (j++)
  65.         jmp     .L11                                    // осуществляет безусловный переход к метке .L11
  66. .L9:                                                    // метка .L9
  67.         movsd   -8(%rbp), %xmm0                         // копирует sin x со стека в регистр %xmm0
  68.         leave                                           // восстанавливает кадр стека
  69.         ret                                             // возвращает sin x
  70. .LC3:                                                   // метка .LC3
  71.         .string "%.10lf\n"                              // инициализированная по метке строка
  72. .LC5:                                                   // метка .LC5
  73.         .string "Time taken: %lf sec.\n"                // инициализированная по метке строка
  74. main:                                                   // метка main
  75.         pushq   %rbp                                    // помещает указатель базы в стек
  76.         movq    %rsp, %rbp                              // копирует указатель стека в указатель базы
  77.         subq    $80, %rsp                               // отнимает от значения stack pointer 80 и сохраняет результат в %rsp
  78.         movl    %edi, -52(%rbp)                         // копирует первый параметр, передаваемый функцией int main(), (int argc) на стек по адресу (%rbp) - 52
  79.         movq    %rsi, -64(%rbp)                         // копирует второй параметр, передаваемый функцией int main(), (char **argv) на стек по адресу (%rbp) - 64
  80.         movq    -64(%rbp), %rax                         // копирует значение со стека из (%rbp) - 64 (char **argv) в регистр %rax
  81.         addq    $8, %rax                                // прибавляет 8 к значению в регистре %rax и записывает результат в %rax
  82.         movq    (%rax), %rax                            // копирует значение по разыменованному адресу (%rax) в %rax
  83.         movq    %rax, %rdi                              // копирует значение из %rax в регистр %rdi
  84.         call    atof                                    // производит вызов функции atof
  85.         movq    %xmm0, %rax                             // копирует результат работы функции из %xmm0 в регистр %rax
  86.         movq    %rax, -8(%rbp)                          // копирует значение %rax на стек по адресу (%rbp) - 8
  87.         movq    -64(%rbp), %rax                         // копирует значение с ячейки стека по адресу (%rbp) - 64 в %rax
  88.         addq    $16, %rax                               // прибавляет 16 к значению в регистре %rax и записывает результат в %rax
  89.         movq    (%rax), %rax                            // копирует значение по разыменованному адресу (%rax) в %rax
  90.         movq    %rax, %rdi                              // копирует значение из регистра %rax в регистр %rdi
  91.         call    atoi                                    // вызов функции atoi
  92.         movl    %eax, -12(%rbp)                         // копирует результат работы функции atoi (значение в регистре %eax) на стек по адресу (%rbp) - 12
  93.         leaq    -32(%rbp), %rax                         // записывает в регистр %rax адрес (%rbp) - 32
  94.         movq    %rax, %rsi                              // копирует значение из регистра %rax в регистр %rsi
  95.         movl    $1, %edi                                // копирует значение 1 и записывает его в регистр %rdi
  96.         call    clock_gettime                           // производит вызов функции clock_gettime
  97.         movq    -8(%rbp), %rdx                          // копирует значение со стека по адресу (%rbp) - 8 и кладёт его в регистр %rdx
  98.         movl    -12(%rbp), %eax                         // копирует значение со стека по адресу (%rbp) - 12 и кладёт его в регистр %eax
  99.         movq    %rdx, -72(%rbp)                         // копирует значение из регистра %rdx на стек по адресу (%rbp) - 72
  100.         movsd   -72(%rbp), %xmm0                        // копирует значение со стека по адресу (%rbp) - 72 в регистр %xmm0
  101.         movl    %eax, %edi                              // копирует значение из регистра %eax в регистр %rdi
  102.         call    _Z6sin_hyid                             // вызывает функцию double sin_hy
  103.         movl    $.LC3, %edi                             // копирует параметр-строку по метке .LC3 в регистр %edi
  104.         movl    $1, %eax                                // копирует значение 1 в регистр %eax
  105.         call    printf                                  // вызывает функцию printf
  106.         leaq    -48(%rbp), %rax                         // записывает в регистр %rax адрес (%rbp) - 48
  107.         movq    %rax, %rsi                              // копирует значение из регистра %rax в регистр %rsi
  108.         movl    $1, %edi                                // копирует значение 1 в регистр %edi
  109.         call    clock_gettime                           // вызывает функцию clock_gettime
  110.         movq    -48(%rbp), %rdx                         // копирует значение со стека по адресу (%rbp) - 48 в регистр %rdx
  111.         movq    -32(%rbp), %rax                         // копирует значение со стека по адресу (%rbp) - 32 в регистр %rax
  112.         subq    %rax, %rdx                              // прибавляет к значению регистра %rax значение регистра %rdx (результат сохраняет в %rdx)
  113.         movq    %rdx, %rax                              // копирует значение из регистра %rdx в регистр %rax
  114.         pxor    %xmm1, %xmm1                            // зануляет значение регистра %xmm1
  115.         cvtsi2sdq       %rax, %xmm1                     // преобразует знаковое целое значение из регистра %rax в одиночное короткое вещественное значение (результат в %xmm1)
  116.         movq    -40(%rbp), %rdx                         // копирует значение со стека по адресу (%rbp) - 40 в регистр %rdx
  117.         movq    -24(%rbp), %rax                         // копирует значение со стека по адресу (%rbp) - 48 в регистр %rax
  118.         subq    %rax, %rdx                              // прибавляет к значению регистра %rax значение регистра %rdx (результат сохраняет в %rdx)
  119.         movq    %rdx, %rax                              // копирует значение из регистра %rdx в регистр %rax
  120.         pxor    %xmm0, %xmm0                            // зануляет значение регистра %xmm0
  121.         cvtsi2sdq       %rax, %xmm0                     // преобразует знаковое целое значение из регистра %rax в одиночное короткое вещественное значение (результат в %xmm0)
  122.         movsd   .LC4(%rip), %xmm2                       // читает константу double по метке .LC0 и кладёт её в регистр %xmm2 (%rip указывает на адрес следующей инструкции)
  123.         mulsd   %xmm2, %xmm0                            // умножает значение регистра %xmm2 на значение регистра %xmm0 и сохраняет результат операции в регистре %xmm0
  124.         addsd   %xmm1, %xmm0                            // складывает значение регистра %xmm1 со значением в регистре %xmm0 и сохраняет результат операции в регистре %xmm0
  125.         movl    $.LC5, %edi                             // читает константу double по метке .LC0 и копирует её в регистр %xmm0 (адрес следующей инструкции лежит в %rip)
  126.         movl    $1, %eax                                // копирует значение 1 в регистр %eax
  127.         call    printf                                  // вызывает функцию printf
  128.         movl    $0, %eax                                // копирует значение 0 в регистр %eax
  129.         leave                                           // восстанавливает кадр стека
  130.         ret                                             // возвращает 0
  131. .LC0:                                                   // метка .LC0
  132.         .long   0                                       // последние 32 нулевых бита 64-битного числа формата double (1.0)
  133.         .long   1072693248                              // первые 32 бита 64-битного числа формата double (1.0)
  134. .LC2:                                                   // метка .LC2
  135.         .long   0                                       // последние 32 нулевых бита 64-битного числа формата double (-0.0) знаковый 0
  136.         .long   -2147483648                             // первые 32 бита 64-битного числа формата double (-0.0) знаковый 0
  137.         .long   0                                       // последние 32 нулевых бита 64-битного числа формата double (0.0) беззнаковый 0
  138.         .long   0                                       // первые 32 нулевых бита 64-битного числа формата double (0.0) беззнаковый 0
  139. .LC4:                                                   // метка .LC4
  140.         .long   3894859413                              // последние 32 бита 64-битного числа формата double (0.000000001)
  141.         .long   1041313291                              // первые 32 бита 64-битного числа формата double (0.000000001)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement