Advertisement
_takumi

nml_for5

Oct 21st, 2022
1,205
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.     mov %rbp, %rsp #for correct debugging
  67.     push    rbp
  68.     mov rbp, rsp
  69.     sub rsp, 48            # выделяем память на стеке для мейн
  70.         # -> scanf
  71.     lea rdx, -40[rbp]      # 3 аргумент для scanf (rdx) - адрес второй переменной которую надо считать (x)
  72.     lea rsi, -44[rbp]      # 2 аргумент (rsi) - адрес первой переменной значение которой нужно считать (n)
  73.     lea rdi, .LC0[rip]     # 1 аргумент (rdi) - форматная строка (%d%d)
  74.     mov eax, 0            
  75.     call    __isoc99_scanf@PLT
  76.         # <- scanf
  77.         # -> malloc a
  78.     mov eax, DWORD PTR -44[rbp] # кладем в rax n
  79.     sal rax, 2                  # с помощью побитового сдвига умножаем его на 4 (размер целочисленного типа данных, определенный компилятором)
  80.     mov rdi, rax                # кладем в rdi полученное число (размер памяти в байтах)
  81.     call    malloc@PLT
  82.     mov QWORD PTR -24[rbp], rax # в rax возвращается указатель на выделенный блок памяти
  83.         # <- malloc
  84.         # -> malloc b
  85.     mov eax, DWORD PTR -44[rbp] # кладем в rax n
  86.     sal rax, 2                  # с помощью побитового сдвига умножаем его на 4 (размер целочисленного типа данных, определенный компилятором)
  87.     mov rdi, rax                # кладем в rdi полученное число (размер памяти в байтах)
  88.     call    malloc@PLT
  89.     mov QWORD PTR -16[rbp], rax # в rax возвращается указатель на выделенный блок памяти
  90.         # <- malloc
  91.  
  92.         # -> for loop
  93.     mov DWORD PTR -36[rbp], 0 # по адресу rbp-36 - счетчик для цикла for
  94.     jmp .L7
  95. .L8:
  96.         # -> scanf a[i]
  97.     mov eax, DWORD PTR -36[rbp]
  98.     cdqe
  99.     lea rdx, 0[0+rax*4]# записываем в rdx байтовое смещение от начала массива а, полученное с помощью умножения счетчика (rax) на 4 (размер int)
  100.     mov rax, QWORD PTR -24[rbp]
  101.     add rax, rdx       # прибавляем к rax (адресу первого элемента массива а) смещение, получаем адрес нужного элемента
  102.     mov rsi, rax       # кладем в rsi полученное значение, это и есть второй аргумент
  103.     lea rdi, .LC1[rip] # 1 аргумент - форматная строка
  104.     mov eax, 0
  105.     call    __isoc99_scanf@PLT
  106.         # <- scanf a[i]
  107.     add DWORD PTR -36[rbp], 1 # увеличиваем счетчик
  108. .L7:
  109.     mov eax, DWORD PTR -44[rbp]
  110.     cmp DWORD PTR -36[rbp], eax
  111.     jl  .L8
  112.         # <- for loop
  113.         # -> solve(a,b,n,x)
  114.     mov ecx, DWORD PTR -40[rbp] # число x
  115.     mov edx, DWORD PTR -44[rbp] # размер массивов
  116.     mov rsi, QWORD PTR -16[rbp] # массив b
  117.     mov rdi, QWORD PTR -24[rbp] # массив а
  118.     call    solve
  119.     mov DWORD PTR -28[rbp], eax # возвращается количество элементов кратных х
  120.         # <- solve(a,b,n,x)
  121.         # -> for loop
  122.     mov DWORD PTR -32[rbp], 0
  123.     jmp .L9
  124. .L10:
  125.     mov eax, DWORD PTR -32[rbp]
  126.     lea rdx, 0[0+rax*4]
  127.     mov rax, QWORD PTR -16[rbp]
  128.     add rax, rdx
  129.     mov eax, DWORD PTR [rax]
  130.     mov esi, eax                # 2-й аргумент - значение которое мы выводим
  131.     lea rdi, .LC2[rip]          # 1-й аргумент - форматная строка
  132.     mov eax, 0
  133.     call    printf@PLT
  134.     add DWORD PTR -32[rbp], 1
  135. .L9:
  136.     mov eax, DWORD PTR -32[rbp]
  137.     cmp eax, DWORD PTR -28[rbp]
  138.     jl  .L10
  139.         # <- for loop
  140.     mov eax, 0
  141.     leave
  142.     ret
  143.     .size   main, .-main
  144.     .ident  "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0"
  145.     .section    .note.GNU-stack,"",@progbits
  146.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement