_takumi

nml_for6

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