Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- _Z6Memberid: // метка функции double Member
- pushq %rbp // помещает указатель базы в стек
- movq %rsp, %rbp // копирует значение указателя стека в указатель базы
- movl %edi, -20(%rbp) // значение параметра int n передаётся на стек по адресу (%rbp) - 20
- movsd %xmm0, -32(%rbp) // значение параметра double x передаётся на стек по адресу (%rbp) - 32
- movsd .LC0(%rip), %xmm0 // читает константу(double res) по метке .LC0 и кладёт её в регистр %xmm0 (%rip содержит адрес след. ком.)
- movsd %xmm0, -8(%rbp) // записывает константу в ячейку стека с адресом (%rbp) - 8
- movsd .LC0(%rip), %xmm0 // снова читает константу по метке .LCO (int i) и кладёт её в регистр %xmm0
- movsd %xmm0, -16(%rbp) // записывает константу в ячейку стека с адресом (%rbp) - 16
- .L4: // метка .L4 (инициализация цикла for в ф-ции double Member)
- pxor %xmm0, %xmm0 // зануляет значение в %xmm0
- cvtsi2sd -20(%rbp), %xmm0 // конвентирует int n в double для сравнения затем его с double i
- ucomisd -16(%rbp), %xmm0 // производит неупорядоченное сравнение скалярных значений двойной точности с плав. запятой (i и n) + выставление EFLAGS
- jb .L7 // условный переход по метке .L7 выполняется при n < i (сравнение второго операнда с 1)
- movsd -32(%rbp), %xmm0 // копирует значение double x в %xmm0
- divsd -16(%rbp), %xmm0 // происходит деление double x на double i (результат остаётся во 2 операнде(%xmm0))
- movsd -8(%rbp), %xmm1 // double res копирует в регистр %xmm1
- mulsd %xmm1, %xmm0 // умножает double res на результат деления и помещает результат в %xmm0
- movsd %xmm0, -8(%rbp) // копирует получившееся значение на стек по адресу (%rbp) - 8
- movsd -16(%rbp), %xmm1 // копирует int i со стека и кладём значение в регистр %xmm1
- movsd .LC0(%rip), %xmm0 // читает константу double i по метке .LC0 и копирует её в регистр %xmm0 (%rip указывает на адрес следующей инструкции)
- addsd %xmm1, %xmm0 // складывает значения в %xmm0 и %xmm1 (результат (i++) в %xmm0)
- movsd %xmm0, -16(%rbp) // новое значение i кладётся в ячейку стека с адресом (%rbp) - 16
- jmp .L4 // производит безусловный переход опять к началу цикла for
- .L7: // метка .L7
- movsd -8(%rbp), %xmm0 // значение double res записывается в %xmm0
- popq %rbp // достаём базу стека
- ret // возвращаем res
- _Z6sin_hyid: // метка функции sin_hy
- pushq %rbp // помещает в стек указатель его базы
- movq %rsp, %rbp // копирует значение указателя стека в указатель базы
- subq $56, %rsp // отнимает от значения stack pointer 56 и сохраняет результат в %rsp
- movl %edi, -36(%rbp) // значение параметра int n передаётся на стек по адресу (%rbp) - 36
- movsd %xmm0, -48(%rbp) // значение параметра double x передаётся на стек по адресу (%rbp) - 48
- pxor %xmm0, %xmm0 // зануляет значение в регистре %xmm0
- movsd %xmm0, -8(%rbp) // копирует значение double sin x в стек по адресу (%rbp) - 8
- movl $0, -12(%rbp) // копирует значение j = 0 в стек по адресу (%rbp) - 12
- .L11: // метка .L11
- movl -12(%rbp), %eax // копирует значение параметра int j из стека в регистр %eax
- cmpl -36(%rbp), %eax // производит сравнение int j с int n
- jg .L9 // условный переход на метку .L9 при j > n
- movl -12(%rbp), %eax // копирует значение int j в регистр %eax
- addl %eax, %eax // складывает int j с самим собой и записывает результат в %eax (2 * j)
- leal 1(%rax), %edx // запишет в %edx значение %rax + 1 (2 * j + 1)
- movq -48(%rbp), %rax // копирует значение double x в регистр %rax
- movq %rax, -56(%rbp) // копирует значение double x обратно на стек по адресу (%rbp) - 56
- movsd -56(%rbp), %xmm0 // копирует двойное слово из (%rbp) - 56 (double x) в %xmm0
- movl %edx, %edi // копирует значение в регистре %edx (2 * j + 1) и помещает его в %edi (1 аргумент функции при передаче)
- call _Z6Memberid // вызывает функцию double Member
- movq %xmm0, %rax // копирует результат работы ф-ции double Member (double tmp) из %xmm0 в %rax
- movq %rax, -24(%rbp) // копирует double tmp из %rax на стек по адресу (%rbp) - 24
- movl -12(%rbp), %eax // копирует int j и помещает его в регистр %eax
- andl $1, %eax // производит побитовое сравнение двоичного представления числа int j в %eax с 1, пишет результат в %eax
- testl %eax, %eax // 0 & 0 = 0 или 1 & 1 = 1 и выставление флагов без записи результата
- je .L10 // условный переход на метку .L10 при %eax & %eax = 0
- movsd -24(%rbp), %xmm1 // копирует double tmp со стека в регистр %xmm1
- movsd .LC2(%rip), %xmm0 // читает константу по метке .LC2 и помещает в регистр %xmm0 (-0) (знаковый 0)
- xorpd %xmm1, %xmm0 // логическое "исключающее или" для двоичного представления числа double tmp c -0 меняет знак на противоположный
- movsd %xmm0, -24(%rbp) // копирует результат предыдущего шага (double tmp) на стек по адресу (%rbp) - 24
- .L10: // метка .L10
- movsd -8(%rbp), %xmm0 // копирует значение double sinx со стека в регистр %xmm0
- addsd -24(%rbp), %xmm0 // прибавляет к double sinx значение double tmp и записывает результат обратно в double sinx (регистр %xmm0)
- movsd %xmm0, -8(%rbp) // кладёт значение double sinx в стек по адресу (%rbp) - 8
- addl $1, -12(%rbp) // инкрементирует значение j (j++)
- jmp .L11 // осуществляет безусловный переход к метке .L11
- .L9: // метка .L9
- movsd -8(%rbp), %xmm0 // копирует sin x со стека в регистр %xmm0
- leave // восстанавливает кадр стека
- ret // возвращает sin x
- .LC3: // метка .LC3
- .string "%.10lf\n" // инициализированная по метке строка
- .LC5: // метка .LC5
- .string "Time taken: %lf sec.\n" // инициализированная по метке строка
- main: // метка main
- pushq %rbp // помещает указатель базы в стек
- movq %rsp, %rbp // копирует указатель стека в указатель базы
- subq $80, %rsp // отнимает от значения stack pointer 80 и сохраняет результат в %rsp
- movl %edi, -52(%rbp) // копирует первый параметр, передаваемый функцией int main(), (int argc) на стек по адресу (%rbp) - 52
- movq %rsi, -64(%rbp) // копирует второй параметр, передаваемый функцией int main(), (char **argv) на стек по адресу (%rbp) - 64
- movq -64(%rbp), %rax // копирует значение со стека из (%rbp) - 64 (char **argv) в регистр %rax
- addq $8, %rax // прибавляет 8 к значению в регистре %rax и записывает результат в %rax
- movq (%rax), %rax // копирует значение по разыменованному адресу (%rax) в %rax
- movq %rax, %rdi // копирует значение из %rax в регистр %rdi
- call atof // производит вызов функции atof
- movq %xmm0, %rax // копирует результат работы функции из %xmm0 в регистр %rax
- movq %rax, -8(%rbp) // копирует значение %rax на стек по адресу (%rbp) - 8
- movq -64(%rbp), %rax // копирует значение с ячейки стека по адресу (%rbp) - 64 в %rax
- addq $16, %rax // прибавляет 16 к значению в регистре %rax и записывает результат в %rax
- movq (%rax), %rax // копирует значение по разыменованному адресу (%rax) в %rax
- movq %rax, %rdi // копирует значение из регистра %rax в регистр %rdi
- call atoi // вызов функции atoi
- movl %eax, -12(%rbp) // копирует результат работы функции atoi (значение в регистре %eax) на стек по адресу (%rbp) - 12
- leaq -32(%rbp), %rax // записывает в регистр %rax адрес (%rbp) - 32
- movq %rax, %rsi // копирует значение из регистра %rax в регистр %rsi
- movl $1, %edi // копирует значение 1 и записывает его в регистр %rdi
- call clock_gettime // производит вызов функции clock_gettime
- movq -8(%rbp), %rdx // копирует значение со стека по адресу (%rbp) - 8 и кладёт его в регистр %rdx
- movl -12(%rbp), %eax // копирует значение со стека по адресу (%rbp) - 12 и кладёт его в регистр %eax
- movq %rdx, -72(%rbp) // копирует значение из регистра %rdx на стек по адресу (%rbp) - 72
- movsd -72(%rbp), %xmm0 // копирует значение со стека по адресу (%rbp) - 72 в регистр %xmm0
- movl %eax, %edi // копирует значение из регистра %eax в регистр %rdi
- call _Z6sin_hyid // вызывает функцию double sin_hy
- movl $.LC3, %edi // копирует параметр-строку по метке .LC3 в регистр %edi
- movl $1, %eax // копирует значение 1 в регистр %eax
- call printf // вызывает функцию printf
- leaq -48(%rbp), %rax // записывает в регистр %rax адрес (%rbp) - 48
- movq %rax, %rsi // копирует значение из регистра %rax в регистр %rsi
- movl $1, %edi // копирует значение 1 в регистр %edi
- call clock_gettime // вызывает функцию clock_gettime
- movq -48(%rbp), %rdx // копирует значение со стека по адресу (%rbp) - 48 в регистр %rdx
- movq -32(%rbp), %rax // копирует значение со стека по адресу (%rbp) - 32 в регистр %rax
- subq %rax, %rdx // прибавляет к значению регистра %rax значение регистра %rdx (результат сохраняет в %rdx)
- movq %rdx, %rax // копирует значение из регистра %rdx в регистр %rax
- pxor %xmm1, %xmm1 // зануляет значение регистра %xmm1
- cvtsi2sdq %rax, %xmm1 // преобразует знаковое целое значение из регистра %rax в одиночное короткое вещественное значение (результат в %xmm1)
- movq -40(%rbp), %rdx // копирует значение со стека по адресу (%rbp) - 40 в регистр %rdx
- movq -24(%rbp), %rax // копирует значение со стека по адресу (%rbp) - 48 в регистр %rax
- subq %rax, %rdx // прибавляет к значению регистра %rax значение регистра %rdx (результат сохраняет в %rdx)
- movq %rdx, %rax // копирует значение из регистра %rdx в регистр %rax
- pxor %xmm0, %xmm0 // зануляет значение регистра %xmm0
- cvtsi2sdq %rax, %xmm0 // преобразует знаковое целое значение из регистра %rax в одиночное короткое вещественное значение (результат в %xmm0)
- movsd .LC4(%rip), %xmm2 // читает константу double по метке .LC0 и кладёт её в регистр %xmm2 (%rip указывает на адрес следующей инструкции)
- mulsd %xmm2, %xmm0 // умножает значение регистра %xmm2 на значение регистра %xmm0 и сохраняет результат операции в регистре %xmm0
- addsd %xmm1, %xmm0 // складывает значение регистра %xmm1 со значением в регистре %xmm0 и сохраняет результат операции в регистре %xmm0
- movl $.LC5, %edi // читает константу double по метке .LC0 и копирует её в регистр %xmm0 (адрес следующей инструкции лежит в %rip)
- movl $1, %eax // копирует значение 1 в регистр %eax
- call printf // вызывает функцию printf
- movl $0, %eax // копирует значение 0 в регистр %eax
- leave // восстанавливает кадр стека
- ret // возвращает 0
- .LC0: // метка .LC0
- .long 0 // последние 32 нулевых бита 64-битного числа формата double (1.0)
- .long 1072693248 // первые 32 бита 64-битного числа формата double (1.0)
- .LC2: // метка .LC2
- .long 0 // последние 32 нулевых бита 64-битного числа формата double (-0.0) знаковый 0
- .long -2147483648 // первые 32 бита 64-битного числа формата double (-0.0) знаковый 0
- .long 0 // последние 32 нулевых бита 64-битного числа формата double (0.0) беззнаковый 0
- .long 0 // первые 32 нулевых бита 64-битного числа формата double (0.0) беззнаковый 0
- .LC4: // метка .LC4
- .long 3894859413 // последние 32 бита 64-битного числа формата double (0.000000001)
- .long 1041313291 // первые 32 бита 64-битного числа формата double (0.000000001)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement