Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -4[rbp] => r12d
- .intel_syntax noprefix # пишем в синаксисе intel
- .text # начинаем секцию
- .section .rodata # .rodata
- .lc0:
- .string "%d" # кладем строчку в бинарник, ставим метку (.lc0 "%d")
- .text # секция с кодом
- .globl inputarr
- .type inputarr, @function
- inputarr: # функция ввода массива
- push rbp # сохранение rbp на стек
- mov rbp, rsp # rbp := rsp
- sub rsp, 32 # rsp -= 80
- mov qword ptr -24[rbp], rdi
- mov r12d, 0 # i = 0
- jmp .l2 # go to l2
- .l3:
- mov eax, r12d # eax := i
- cdqe # преобразование в sign-extend
- lea rdx, 0[0+rax*4] # rdx := rax * 4
- mov rax, qword ptr -24[rbp] # rax := rbp - 24
- add rax, rdx # rax += rdx
- mov rsi, rax # rsi := rax
- lea rdi, .lc0[rip]
- mov eax, 0 # eax := 0
- call __isoc99_scanf@plt # scanf("%d")
- add r12d, 1 # ++i
- .l2:
- cmp r12d, 4 # compare int i и 4 (всего 5 эллементов)
- jle .l3 # jump less => .l3
- nop # не выполняет никакой операции, занимает место в потоме команд
- nop # не выполняет никакой операции, занимает место в потоме команд
- leave # / выход из функции
- ret # \
- createnewarr: # функция создание нового массива
- push rbp # сохраняем rbp на стек
- mov rbp, rsp # rbp := rsp
- mov qword ptr -24[rbp], rdi
- mov qword ptr -32[rbp], rsi
- mov byte ptr -1[rbp], 1
- mov dword ptr -8[rbp], 4
- jmp .l5
- .l9:
- cmp byte ptr -1[rbp], 0
- je .l6
- mov eax, dword ptr -8[rbp]
- cdqe
- lea rdx, 0[0+rax*4]
- mov rax, qword ptr -24[rbp]
- add rax, rdx
- mov eax, dword ptr [rax]
- test eax, eax
- jle .l6
- mov byte ptr -1[rbp], 0
- jmp .l7
- .l6:
- movzx eax, byte ptr -1[rbp]
- xor eax, 1
- test al, al
- je .l8
- mov eax, dword ptr -8[rbp]
- cdqe
- lea rdx, 0[0+rax*4]
- mov rax, qword ptr -24[rbp]
- add rax, rdx
- mov edx, 3
- sub edx, dword ptr -8[rbp]
- movsx rdx, edx
- lea rcx, 0[0+rdx*4]
- mov rdx, qword ptr -32[rbp]
- add rdx, rcx
- mov eax, dword ptr [rax]
- mov dword ptr [rdx], eax
- jmp .l7
- .l8:
- mov eax, dword ptr -8[rbp]
- cdqe
- lea rdx, 0[0+rax*4]
- mov rax, qword ptr -24[rbp]
- add rax, rdx
- mov edx, 4
- sub edx, dword ptr -8[rbp]
- movsx rdx, edx
- lea rcx, 0[0+rdx*4]
- mov rdx, qword ptr -32[rbp]
- add rdx, rcx
- mov eax, dword ptr [rax]
- mov dword ptr [rdx], eax
- .l7:
- sub dword ptr -8[rbp], 1
- .l5:
- cmp dword ptr -8[rbp], 0
- jns .l9
- nop # не выполняет никакой операции, занимает место в потоме команд
- nop # не выполняет никакой операции, занимает место в потоме команд
- pop rbp
- ret
- havepositive: # функция проверки на хотя бы одно положительное число
- push rbp # сохранение rbp на стек
- mov rbp, rsp # rbp := rsp
- mov qword ptr -24[rbp], rdi
- mov r12d, 0
- jmp .l11
- .l14:
- mov eax, r12d
- cdqe
- lea rdx, 0[0+rax*4]
- mov rax, qword ptr -24[rbp]
- add rax, rdx
- mov eax, dword ptr [rax]
- test eax, eax
- jle .l12
- mov eax, 1
- jmp .l13
- .l12:
- add r12d, 1
- .l11:
- cmp r12d, 4
- jle .l14
- mov eax, 0
- .l13:
- pop rbp
- ret
- .size havepositive, .-havepositive
- .section .rodata
- .lc1:
- .string "%d "
- .text
- .globl printarr
- .type printarr, @function
- printarr:
- push rbp # сохранение rbp на стек
- mov rbp, rsp # rbp := rsp
- sub rsp, 32
- mov qword ptr -24[rbp], rdi
- mov dword ptr -28[rbp], esi
- mov r12d, 0
- jmp .l16
- .l17:
- mov eax, r12d
- cdqe
- lea rdx, 0[0+rax*4]
- mov rax, qword ptr -24[rbp]
- add rax, rdx
- mov eax, dword ptr [rax]
- mov esi, eax
- lea rdi, .lc1[rip]
- mov eax, 0
- call printf@plt
- add r12d, 1
- .l16:
- mov eax, r12d
- cmp eax, dword ptr -28[rbp]
- jl .l17
- nop # не выполняет никакой операции, занимает место в потоме команд
- nop # не выполняет никакой операции, занимает место в потоме команд
- leave
- ret
- .size printarr, .-printarr # /
- .globl main # | указание на main
- .type main, @function # \
- main:
- push rbp # сохранение rbp на стек
- mov rbp, rsp # rbp := rsp
- sub rsp, 80 # rsp -= 80 (выделяем память для фрейма)
- lea rdi, -32[rbp] # сразу присваиваем rdi := $(-32 на стеке)
- call inputarr # вызов функции ввода массива
- lea rax, -32[rbp]
- mov rdi, rax
- call havepositive
- test al, al
- je .l19
- lea rdx, -48[rbp]
- lea rax, -32[rbp]
- mov rsi, rdx
- mov rdi, rax
- call createnewarr
- lea rax, -48[rbp]
- mov esi, 4
- mov rdi, rax
- call printarr
- jmp .l20
- .l19:
- lea rdx, -80[rbp]
- lea rax, -32[rbp]
- mov rsi, rdx
- mov rdi, rax
- call createnewarr
- lea rax, -80[rbp]
- mov esi, 5
- mov rdi, rax
- call printarr
- .l20:
- mov eax, 0
- leave # / выход из функции
- ret # \
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement