Advertisement
_takumi

nml_for6.final

Oct 23rd, 2022 (edited)
1,198
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      QWORD PTR -24[rbp], r12
  10.         mov      QWORD PTR -32[rbp], rbx
  11.         mov      QWORD PTR -40[rbp], r14
  12.         mov      QWORD PTR -48[rbp], r15
  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      r12, rdx
  18.     ##mov   DWORD PTR -40[rbp], ecx # x
  19.         mov      ebx, ecx
  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 rdx, 0[0+r15*4]         # получаем смещение от начала массива а до нужного элемента в байтах
  30.     mov eax, DWORD PTR [rdi+rdx]# кладем в еах значение нужного элемента
  31.     cdq                              # расширяем до 64 битов
  32.     idiv    ebx                     # получаем остаток (в edx)
  33.     test    edx, edx                # проверяем на равенство нулю
  34.     jne .L3
  35.         # {
  36.     lea rdx, 0[0+r15*4]         # получаем байтовое смещение
  37.     lea rcx, [rdx+rdi]          # получаем в rcx адрес элемента a[i]
  38.     mov rax, r14                # кладем в rax счетчик j
  39.     lea r14, 1[rax]             # кладем в r14 j+1
  40.     lea rdx, 0[0+rax*4+rsi]     # в rdx получаем адрес элемента b[j]
  41.     mov eax, DWORD PTR [rcx]    # кладем в еах значение элемента a[i]
  42.     mov DWORD PTR [rdx], eax    # кладем в b[j] значение элемента a[i]
  43.         # }
  44. .L3:    # <- if
  45.     inc r15                     # инкрементируем i
  46. .L2:
  47.     cmp r15, r12
  48.     jl  .L4
  49.         # <- for loop
  50.     mov rax, r14                # в rax возвращаем размер массива b
  51.         mov      r12, QWORD PTR -24[rbp]
  52.         mov      rbx, QWORD PTR -32[rbp]
  53.         mov      r14, QWORD PTR -40[rbp]
  54.         mov      r15, QWORD PTR -48[rbp]
  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 rbp, rsp
  71.     sub rsp, 48            # выделяем память на стеке для мейн
  72.         # -> scanf
  73.     lea rdx, -40[rbp]      # 3 аргумент для scanf (rdx) - адрес второй переменной которую надо считать (x)
  74.     lea rsi, -44[rbp]      # 2 аргумент (rsi) - адрес первой переменной значение которой нужно считать (n)
  75.     lea rdi, .LC0[rip]     # 1 аргумент (rdi) - форматная строка (%d%d)
  76.     mov eax, 0            
  77.     call    __isoc99_scanf@PLT
  78.         # <- scanf
  79.         # -> malloc a
  80.     mov edi, DWORD PTR -44[rbp] # кладем в rdi n
  81.     sal rdi, 2                  # с помощью побитового сдвига умножаем его на 4 (размер целочисленного типа данных, определенный компилятором)
  82.     call    malloc@PLT
  83.     ##mov   QWORD PTR -24[rbp], rax # в rax возвращается указатель на выделенный блок памяти
  84.         mov      r12, rax # вместо памяти сохраняем указатель на выделенную под массив а память в регистр r12
  85.         # <- malloc
  86.         # -> malloc b
  87.     mov edi, DWORD PTR -44[rbp] # кладем в rax n
  88.     sal rdi, 2                  # с помощью побитового сдвига умножаем его на 4 (размер целочисленного типа данных, определенный компилятором)
  89.     call    malloc@PLT
  90.     ##mov   QWORD PTR -16[rbp], rax # в rax возвращается указатель на выделенный блок памяти
  91.         mov      r13, rax
  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 rdx, 0[0+rbx*4]# записываем в rdx байтовое смещение от начала массива а, полученное с помощью умножения счетчика (rax) на 4 (размер int)
  101.     lea rsi, [r12+rdx]       # получаем в rsi адрес элемента a[i]
  102.     lea rdi, .LC1[rip] # 1 аргумент - форматная строка
  103.     mov eax, 0
  104.     call    __isoc99_scanf@PLT
  105.         # <- scanf a[i]
  106.     inc     rbx # увеличиваем счетчик
  107. .L7:
  108.     cmp ebx, DWORD PTR -44[rbp]
  109.     jl  .L8
  110.         # <- for loop
  111.         # -> solve(a,b,n,x)
  112.     mov ecx, DWORD PTR -40[rbp] # число x
  113.     mov edx, DWORD PTR -44[rbp] # размер массивов
  114.     mov rsi, r13 # массив b
  115.     mov rdi, r12 # массив а
  116.     call    solve
  117.     ##mov   DWORD PTR -28[rbp], eax # возвращается количество элементов кратных х
  118.         mov      r14, rax # вместо памяти сохраняем в регистр возвращаемое количество элементов кратных числу х
  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 rdx, 0[0+r15*4]
  126.     lea rsi, [r13+rdx]
  127.     mov esi, DWORD PTR [esi]    # 2-й аргумент - значение которое мы выводим
  128.     lea rdi, .LC2[rip]          # 1-й аргумент - форматная строка
  129.     mov eax, 0
  130.     call    printf@PLT
  131.     inc     r15
  132. .L9:
  133.     cmp r15, r14
  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