Advertisement
_takumi

vimref

Oct 23rd, 2022 (edited)
1,149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     .file   "nomorelizing.c"
  2.     .intel_syntax noprefix
  3.     .text
  4.     .globl  solve
  5.     .type   solve, @function
  6. solve:
  7.     push    %rbp
  8.     mov %rbp, %rsp
  9.         mov       %r12, -24(%rbp)
  10.         mov       %rbx, -32(%rbp)
  11.         mov       %r14, -40(%rbp)
  12.         mov       %r15, -48(%rbp)
  13.         # -> передача параметров из регистра на стек
  14.     ##mov   QWORD PTR -24(%rbp), %rdi # a
  15.     ##mov   QWORD PTR -32(%rbp), %rsi # b
  16.     ##mov   DWORD PTR -36(%rbp), %edx # n
  17.         mov       %rdx, %r12
  18.     ##mov   DWORD PTR -40(%rbp), %ecx # x
  19.         mov       %ecx, %ebx
  20.         # <- передача параметров из регистра на стек
  21.     ##mov   DWORD PTR -8(%rbp), 0 # счетчик j
  22.         xor       %r14, %r14
  23.     ##mov   DWORD PTR -4(%rbp), 0 # счетчик i
  24.         xor       %r15, %r15
  25.     jmp .L2
  26.         # -> for loop
  27. .L4:
  28.         # -> if a(i) % x == 0
  29.     lea 0(0+%r15*4), %rdx         # получаем смещение от начала массива а до нужного элемента в байтах
  30.     mov  (%rdi+%rdx), %eax       # кладем в еах значение нужного элемента
  31.     cdq                              # расширяем до 64 битов
  32.     idiv    %ebx                     # получаем остаток (в %edx)
  33.     test    %edx, %edx                # проверяем на равенство нулю
  34.     jne .L3
  35.         # {
  36.     lea  0(0+%r15*4), %rdx        # получаем байтовое смещение
  37.     lea  (%rdx+%rdi), %rcx         # получаем в %rcx адрес элемента a(i)
  38.     mov  %r14, %rax               # кладем в %rax счетчик j
  39.     lea  1(%rax), %r14            # кладем в %r14 j+1
  40.     lea  0(0+%rax*4+%rsi), %rdx    # в %rdx получаем адрес элемента b(j)
  41.     mov  (%rcx), %eax   # кладем в еах значение элемента a(i)
  42.     mov  %eax, (%rdx)   # кладем в b(j) значение элемента a(i)
  43.         # }
  44. .L3:    # <- if
  45.     inc %r15                     # инкрементируем i
  46. .L2:
  47.     cmp %r12, %r15
  48.     jl  .L4
  49.         # <- for loop
  50.     mov  %r14, %rax               # в %rax возвращаем размер массива b
  51.         mov       -24(%rbp), %r12
  52.         mov       -32(%rbp), %rbx
  53.         mov       -40(%rbp), %r14
  54.         mov       -48(%rbp), %r15
  55.     pop %rbp
  56.     ret
  57.     .size   solve, .-solve
  58.     .section    .rodata
  59. .LC0:
  60.     .string "%d%d"
  61. .LC1:
  62.     .string "%d"
  63. .LC2:
  64.     .string "%d "
  65.     .text
  66.     .globl  main
  67.     .type   main, @function
  68. main:
  69.     push    %rbp
  70.     mov %rsp, %rbp
  71.     sub 48, %rsp            # выделяем память на стеке для мейн
  72.         # -> scanf
  73.     lea  -40(%rbp), %rdx     # 3 аргумент для scanf (%rdx) - адрес второй переменной которую надо считать (x)
  74.     lea  -44(%rbp), %rsi     # 2 аргумент (%rsi) - адрес первой переменной значение которой нужно считать (n)
  75.     lea  .LC0(rip), %rdi    # 1 аргумент (%rdi) - форматная строка (%d%d)
  76.     mov 0, %eax              
  77.     call    __isoc99_scanf@PLT
  78.         # <- scanf
  79.         # -> malloc a
  80.     mov  -44(%rbp), %edi# кладем в %rdi n
  81.     sal  2, %rdi                 # с помощью побитового сдвига умножаем его на 4 (размер целочисленного типа данных, определенный компилятором)
  82.     call    malloc@PLT
  83.     ##mov   QWORD PTR -24(%rbp), %rax # в %rax возвращается указатель на выделенный блок памяти
  84.         mov       %rax, %r12# вместо памяти сохраняем указатель на выделенную под массив а память в регистр %r12
  85.         # <- malloc
  86.         # -> malloc b
  87.     mov  -44(%rbp), %edi# кладем в %rax n
  88.     sal  2, %rdi                 # с помощью побитового сдвига умножаем его на 4 (размер целочисленного типа данных, определенный компилятором)
  89.     call    malloc@PLT
  90.     ##mov   QWORD PTR -16(%rbp), %rax # в %rax возвращается указатель на выделенный блок памяти
  91.         mov       %rax, %r13
  92.         # <- malloc
  93.  
  94.         # -> for loop
  95.     ##mov   DWORD PTR -36(%rbp), 0 # по адресу %rbp-36 - счетчик для цикла for
  96.         xor      %rbx, %rbx # вместо памяти используем для счетчика цикла регистр %rbx
  97.     jmp .L7
  98. .L8:
  99.         # -> scanf a(i)
  100.     lea  0(0+%rbx*4), %rdx# записываем в %rdx байтовое смещение от начала массива а, полученное с помощью умножения счетчика (%rax) на 4 (размер int)
  101.     lea  (%r12+%rdx), %rsi      # получаем в %rsi адрес элемента a(i)
  102.     lea  .LC1(rip), %rdi# 1 аргумент - форматная строка
  103.     mov 0, %eax
  104.     call    __isoc99_scanf@PLT
  105.         # <- scanf a(i)
  106.     inc     %rbx # увеличиваем счетчик
  107. .L7:
  108.     cmp  -44(%rbp), %ebx
  109.     jl  .L8
  110.         # <- for loop
  111.         # -> solve(a,b,n,x)
  112.     mov  -40(%rbp), %ecx# число x
  113.     mov  -44(%rbp), %edx# размер массивов
  114.     mov  %r13, %rsi# массив b
  115.     mov  %r12, %rdi# массив а
  116.     call    solve
  117.     ##mov   DWORD PTR -28(%rbp), %eax # возвращается количество элементов кратных х
  118.         mov       %rax, %r14# вместо памяти сохраняем в регистр возвращаемое количество элементов кратных числу х
  119.         # <- solve(a,b,n,x)
  120.         # -> for loop
  121.     ##mov   DWORD PTR -32(%rbp), 0
  122.         xor      %r15, %r15 # счетчик цикла
  123.     jmp .L9
  124. .L10:
  125.     lea  0(0+%r15*4), %rdx
  126.     lea (%r13+%rdx), %rsi
  127.     mov  (%esi), %esi            # 2-й аргумент - значение которое мы выводим
  128.     lea  .LC2(rip), %rdi         # 1-й аргумент - форматная строка
  129.     mov 0, %eax
  130.     call    printf@PLT
  131.     inc     %r15
  132. .L9:
  133.     cmp %r14, %r15
  134.     jl  .L10
  135.         # <- for loop
  136.     xor      %eax, %eax
  137.     leave
  138.     ret
  139.     .size   main, .-main
  140.     .ident  "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0"
  141.     .section    .note.GNU-stack,"",@progbits
  142.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement