Advertisement
Screbber

Untitled

Oct 23rd, 2022
730
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # -4[rbp] => r12d
  2.  
  3.     .intel_syntax noprefix      # пишем в синаксисе intel
  4.     .text               # начинаем секцию
  5.     .section    .rodata # .rodata
  6. .lc0:
  7.     .string "%d"        # кладем строчку в бинарник, ставим метку (.lc0 "%d")
  8.    
  9.     .text               # секция с кодом
  10.     .globl  inputarr
  11.     .type   inputarr, @function
  12.    
  13. inputarr:               # функция ввода массива
  14.     push    rbp         # сохранение rbp на стек
  15.     mov rbp, rsp        # rbp := rsp
  16.     sub rsp, 32     # rsp -= 80
  17.     mov qword ptr -24[rbp], rdi    
  18.     mov r12d, 0         #  i = 0
  19.     jmp .l2         # go to l2
  20. .l3:
  21.     mov eax, r12d # eax := i
  22.     cdqe                # преобразование в sign-extend
  23.     lea rdx, 0[0+rax*4] # rdx := rax * 4
  24.     mov rax, qword ptr -24[rbp] # rax := rbp - 24
  25.     add rax, rdx        # rax += rdx
  26.     mov rsi, rax        # rsi := rax
  27.     lea rdi, .lc0[rip]     
  28.     mov eax, 0          # eax := 0
  29.     call    __isoc99_scanf@plt  # scanf("%d")
  30.     add r12d, 1     # ++i
  31. .l2:
  32.     cmp r12d, 4     # compare int i и 4 (всего 5 эллементов)
  33.     jle .l3         # jump less => .l3
  34.     nop             # не выполняет никакой операции, занимает место в потоме команд
  35.     nop             # не выполняет никакой операции, занимает место в потоме команд
  36.     leave               # / выход из функции
  37.     ret             # \
  38.    
  39. createnewarr:               # функция создание нового массива
  40.     push    rbp         # сохраняем rbp на стек
  41.     mov rbp, rsp        # rbp := rsp
  42.     mov qword ptr -24[rbp], rdi
  43.     mov qword ptr -32[rbp], rsi
  44.     mov byte ptr -1[rbp], 1
  45.     mov dword ptr -8[rbp], 4
  46.     jmp .l5
  47. .l9:
  48.     cmp byte ptr -1[rbp], 0
  49.     je  .l6
  50.     mov eax, dword ptr -8[rbp]
  51.     cdqe
  52.     lea rdx, 0[0+rax*4]
  53.     mov rax, qword ptr -24[rbp]
  54.     add rax, rdx
  55.     mov eax, dword ptr [rax]
  56.     test    eax, eax
  57.     jle .l6
  58.     mov byte ptr -1[rbp], 0
  59.     jmp .l7
  60. .l6:
  61.     movzx   eax, byte ptr -1[rbp]
  62.     xor eax, 1
  63.     test    al, al
  64.     je  .l8
  65.     mov eax, dword ptr -8[rbp]
  66.     cdqe
  67.     lea rdx, 0[0+rax*4]
  68.     mov rax, qword ptr -24[rbp]
  69.     add rax, rdx
  70.     mov edx, 3
  71.     sub edx, dword ptr -8[rbp]
  72.     movsx   rdx, edx
  73.     lea rcx, 0[0+rdx*4]
  74.     mov rdx, qword ptr -32[rbp]
  75.     add rdx, rcx
  76.     mov eax, dword ptr [rax]
  77.     mov dword ptr [rdx], eax
  78.     jmp .l7
  79. .l8:
  80.     mov eax, dword ptr -8[rbp]
  81.     cdqe
  82.     lea rdx, 0[0+rax*4]
  83.     mov rax, qword ptr -24[rbp]
  84.     add rax, rdx
  85.     mov edx, 4
  86.     sub edx, dword ptr -8[rbp]
  87.     movsx   rdx, edx
  88.     lea rcx, 0[0+rdx*4]
  89.     mov rdx, qword ptr -32[rbp]
  90.     add rdx, rcx
  91.     mov eax, dword ptr [rax]
  92.     mov dword ptr [rdx], eax
  93. .l7:
  94.     sub dword ptr -8[rbp], 1
  95. .l5:
  96.     cmp dword ptr -8[rbp], 0
  97.     jns .l9
  98.     nop             # не выполняет никакой операции, занимает место в потоме команд
  99.     nop             # не выполняет никакой операции, занимает место в потоме команд
  100.     pop rbp
  101.     ret
  102. havepositive:               # функция проверки на хотя бы одно положительное число
  103.     push    rbp         # сохранение rbp на стек
  104.     mov rbp, rsp        # rbp := rsp
  105.     mov qword ptr -24[rbp], rdi
  106.     mov r12d, 0
  107.     jmp .l11
  108. .l14:
  109.     mov eax, r12d
  110.     cdqe
  111.     lea rdx, 0[0+rax*4]
  112.     mov rax, qword ptr -24[rbp]
  113.     add rax, rdx
  114.     mov eax, dword ptr [rax]
  115.     test    eax, eax
  116.     jle .l12
  117.     mov eax, 1
  118.     jmp .l13
  119. .l12:
  120.     add r12d, 1
  121. .l11:
  122.     cmp r12d, 4
  123.     jle .l14
  124.     mov eax, 0
  125. .l13:
  126.     pop rbp
  127.     ret
  128.     .size   havepositive, .-havepositive
  129.     .section    .rodata
  130. .lc1:
  131.     .string "%d "
  132.     .text
  133.     .globl  printarr
  134.     .type   printarr, @function
  135. printarr:
  136.     push    rbp         # сохранение rbp на стек
  137.     mov rbp, rsp        # rbp := rsp
  138.     sub rsp, 32
  139.     mov qword ptr -24[rbp], rdi
  140.     mov dword ptr -28[rbp], esi
  141.     mov r12d, 0
  142.     jmp .l16
  143. .l17:
  144.     mov eax, r12d
  145.     cdqe
  146.     lea rdx, 0[0+rax*4]
  147.     mov rax, qword ptr -24[rbp]
  148.     add rax, rdx
  149.     mov eax, dword ptr [rax]
  150.     mov esi, eax
  151.     lea rdi, .lc1[rip]
  152.     mov eax, 0
  153.     call    printf@plt
  154.     add r12d, 1
  155. .l16:
  156.     mov eax, r12d
  157.     cmp eax, dword ptr -28[rbp]
  158.     jl  .l17
  159.     nop             # не выполняет никакой операции, занимает место в потоме команд
  160.     nop             # не выполняет никакой операции, занимает место в потоме команд
  161.     leave
  162.     ret
  163.    
  164.     .size   printarr, .-printarr    # /
  165.     .globl  main            # | указание на main
  166.     .type   main, @function # \
  167.    
  168. main:              
  169.     push    rbp         # сохранение rbp на стек
  170.     mov rbp, rsp        # rbp := rsp
  171.     sub rsp, 80     # rsp -= 80 (выделяем память для фрейма)
  172.      
  173.     lea rdi, -32[rbp]       # сразу присваиваем rdi := $(-32 на стеке)
  174.  
  175.    
  176.     call    inputarr        # вызов функции ввода массива
  177.     lea rax, -32[rbp]
  178.     mov rdi, rax
  179.     call    havepositive
  180.     test    al, al
  181.     je  .l19
  182.     lea rdx, -48[rbp]
  183.     lea rax, -32[rbp]
  184.     mov rsi, rdx
  185.     mov rdi, rax
  186.     call    createnewarr
  187.     lea rax, -48[rbp]
  188.     mov esi, 4
  189.     mov rdi, rax
  190.     call    printarr
  191.     jmp .l20
  192. .l19:
  193.     lea rdx, -80[rbp]
  194.     lea rax, -32[rbp]
  195.     mov rsi, rdx
  196.     mov rdi, rax
  197.     call    createnewarr
  198.     lea rax, -80[rbp]
  199.     mov esi, 5
  200.     mov rdi, rax
  201.     call    printarr
  202. .l20:
  203.     mov eax, 0
  204.     leave               # / выход из функции
  205.     ret             # \
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement