Advertisement
Screbber

Untitled

Nov 13th, 2022
734
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # -4[rbp] => r12d
  2. # -8[rbp] => r13d
  3. # -12[rbp] => r14d
  4.  
  5.         .intel_syntax noprefix          # пишем в синаксисе intel      
  6.         .text                           # начинаем секцию
  7. addToPairs:                             # функция добаления пары в наш словарь
  8.         push  rbp                       # сохранение rbp на стек
  9.         mov  rbp, rsp                   # rbp := rsp
  10.         mov  QWORD PTR -24[rbp], rdi    # |
  11.         mov  QWORD PTR -32[rbp], rsi    # |     Передача параметоров в функцию addToPairs
  12.         mov  QWORD PTR -40[rbp], rdx    # |  
  13.         mov  QWORD PTR -48[rbp], rcx    # |
  14.         mov  r12d, 0                    # i = 0
  15.         jmp  .L2                        # go to l2
  16. .L9:
  17.         mov  eax, r12d                  # eax := i
  18.         movsx  rdx, eax                 # перемещаем в rdx с расширением разрядности
  19.         mov  rax, rdx                   # rdx := rdx
  20.         sal  rax, 4                     # побитовый сдвиг числа влево
  21.         sub  rax, rdx                   # rax := rax - rdx
  22.         sal  rax, 3                     # побитовый сдвиг числа влево
  23.         mov  rdx, rax                   # rdx -= rax
  24.         mov  rax, QWORD PTR -24[rbp]    # двигаем указатель
  25.         add  rax, rdx                   # rax := rdx
  26.         mov  rax, QWORD PTR [rax]       # двигаем указатель
  27.         cmp  QWORD PTR -48[rbp], rax    # проверяем pair_array[i].len_word == temp_string_len
  28.         jne  .L3                        # если pair_array[i].len_word != temp_string_len, то jump .L3
  29.         mov  r13d, 0                    # j := 0
  30.         jmp  .L4                        # go to  to .L4
  31. .L8:
  32.         mov  eax, r12d                  # eax := r12d
  33.         movsx  rdx, eax                 # перемещаем в rdx с расширением разрядности
  34.         mov  rax, rdx                   # rax = rdx
  35.         sal  rax, 4                     # побитовый сдвиг числа влево
  36.         sub  rax, rdx                   # rax := rax - rdx
  37.         sal  rax, 3                     # побитовый сдвиг числа влево
  38.         mov  rdx, rax                   # rdx := rax
  39.         mov  rax, QWORD PTR -24[rbp]    # перемещаем указатель
  40.         add  rdx, rax                   # rdx := rax
  41.         mov  eax, r13d                  # eax := r13d
  42.         cdqe                            # преобразование в sign-extend
  43.         movzx  edx, BYTE PTR 8[rdx+rax] # перемещаем в edx с расширением разрядности
  44.         mov  eax, r13d                  # eax := r13d
  45.         movsx  rcx, eax                 # перемещаем в rcx с расширением разрядности
  46.         mov  rax, QWORD PTR -40[rbp]    # перемещаем указатель
  47.         add  rax, rcx                   # rax := rax + rcx
  48.         movzx  eax, BYTE PTR [rax]      # перемещаем в eax с расширением разрядности    
  49.         cmp  dl, al                     # pair_array[i].word[j] != char_line[j]
  50.         jne  .L12                       # если != , то jump .L12
  51.         mov  eax, r13d                  # eax := r13d
  52.         cdqe                            # преобразование в sign-extend
  53.         mov  rdx, QWORD PTR -48[rbp]    # двигаем указатель
  54.         sub  rdx, 1                     # temp_string_len - 1
  55.         cmp  rax, rdx                   # сравнение rax, rdx
  56.         jne  .L6                        # если не равно, то jump .L6
  57.         mov  eax, r12d                  # eax := r12d  
  58.         movsx  rdx, eax                 # перемещаем в rdx с расширением разрядности  
  59.         mov  rax, rdx                   # rax = rdx
  60.         sal  rax, 4                     # |
  61.         sub  rax, rdx                   # | побитовые сдвиги и вычитание
  62.         sal  rax, 3                     # |
  63.         mov  rdx, rax                   # rdx := rax
  64.         mov  rax, QWORD PTR -24[rbp]    # перемещаем указатель
  65.         add  rax, rdx                   # rax += rdx
  66.         mov  rdx, QWORD PTR 112[rax]    # перемещаем указатель
  67.         add  rdx, 1                     # ++pair_array[i].counter
  68.         mov  QWORD PTR 112[rax], rdx    # QWORD PTR 112[rax] = rdx
  69.         jmp  .L1                        # go to  .L1
  70. .L6:
  71.         add  r13d, 1                    # ++j
  72. .L4:
  73.         mov  eax, r13d                  # eax := r13d
  74.         cdqe                            # преобразование в sign-extend
  75.         cmp  QWORD PTR -48[rbp], rax    # j < temp_string_len
  76.         ja  .L8                         # если больше, то jump .L8
  77.         jmp  .L3                        # go to  .L3
  78. .L12:
  79.         nop                             # не выполняет никакой операции, занимает место в потоке команд
  80. .L3:
  81.         add  r12d, 1                    # ++i
  82. .L2:
  83.         mov  eax, r12d                  # eax :+ r12d
  84.         movsx  rdx, eax                 # перемещаем в rdx с расширением разрядности
  85.         mov  rax, QWORD PTR -32[rbp]    # двигаем указатель
  86.         mov  rax, QWORD PTR [rax]       # двигаем указатель
  87.         cmp  rdx, rax                   # i < *pairs_array_len
  88.         jb  .L9                         # если меньше, то jump .L9
  89.         mov  r11d, 0                    # i = 0
  90.         jmp  .L10                       # go to  .L10
  91. .L11:
  92.         mov  eax, r11d                  # eax := r11d
  93.         movsx  rdx, eax                 # перемещаем в rdx с расширением разрядности
  94.         mov  rax, QWORD PTR -40[rbp]    # двигаем указатель
  95.         lea  rsi, [rdx+rax]             #
  96.         mov  rax, QWORD PTR -32[rbp]    # двигаем указатель
  97.         mov  rdx, QWORD PTR [rax]       # двигаем указатель
  98.         mov  rax, rdx                   # rax := rdx
  99.         sal  rax, 4                     # |
  100.         sub  rax, rdx                   # | побитовые сдвиги и вычитание
  101.         sal  rax, 3                     # |
  102.         mov  rdx, rax                   # rdx := rax
  103.         mov  rax, QWORD PTR -24[rbp]    # двигаем указатель
  104.         lea  rcx, [rdx+rax]             #
  105.         movzx  edx, BYTE PTR [rsi]      #
  106.         mov  eax, r11d                  # eax := r11d
  107.         cdqe                            # преобразование в sign-extend
  108.         mov  BYTE PTR 8[rcx+rax], dl    # pair_array[*pairs_array_len].word[i] = char_line[i];
  109.         add  r11d, 1                    # ++i
  110. .L10:
  111.         mov  eax, r11d                  # eax := r11d
  112.         cdqe                            # преобразование в sign-extend
  113.         cmp  QWORD PTR -48[rbp], rax    #
  114.         ja  .L11                        # go to .L11
  115.         mov  rax, QWORD PTR -32[rbp]
  116.         mov  rdx, QWORD PTR [rax]
  117.         mov  rax, rdx
  118.         sal  rax, 4
  119.         sub  rax, rdx
  120.         sal  rax, 3
  121.         mov  rdx, rax
  122.         mov  rax, QWORD PTR -24[rbp]
  123.         add  rdx, rax
  124.         mov  rax, QWORD PTR -48[rbp]
  125.         mov  QWORD PTR [rdx], rax
  126.         mov  rax, QWORD PTR -32[rbp]
  127.         mov  rdx, QWORD PTR [rax]
  128.         mov  rax, rdx
  129.         sal  rax, 4
  130.         sub  rax, rdx
  131.         sal  rax, 3
  132.         mov  rdx, rax
  133.         mov  rax, QWORD PTR -24[rbp]
  134.         add  rax, rdx
  135.         mov  QWORD PTR 112[rax], 1
  136.         mov  rax, QWORD PTR -32[rbp]
  137.         mov  rax, QWORD PTR [rax]
  138.         lea  rdx, 1[rax]
  139.         mov  rax, QWORD PTR -32[rbp]
  140.         mov  QWORD PTR [rax], rdx
  141. .L1:
  142.         pop  rbp
  143.         ret
  144. .LC0:
  145.         .string  "%ld \n"
  146.         .text
  147.         .globl  printPairs
  148.         .type  printPairs, @function
  149.        
  150. printPairs:
  151.         push  rbp
  152.         mov  rbp, rsp
  153.         sub  rsp, 32
  154.         mov  QWORD PTR -24[rbp], rdi
  155.         mov  QWORD PTR -32[rbp], rsi
  156.         mov  r12d, 0
  157.         jmp  .L14
  158. .L17:
  159.         mov  r13d, 0
  160.         jmp  .L15
  161. .L16:
  162.         mov  eax, r12d
  163.         movsx  rdx, eax
  164.         mov  rax, rdx
  165.         sal  rax, 4
  166.         sub  rax, rdx
  167.         sal  rax, 3
  168.         mov  rdx, rax
  169.         mov  rax, QWORD PTR -24[rbp]
  170.         add  rdx, rax
  171.         mov  eax, r13d
  172.         cdqe
  173.         movzx  eax, BYTE PTR 8[rdx+rax]
  174.         movsx  eax, al
  175.         mov  edi, eax
  176.         call  putchar@PLT
  177.         add  r13d, 1
  178. .L15:
  179.         mov  eax, r13d
  180.         movsx  rcx, eax
  181.         mov  eax, r12d
  182.         movsx  rdx, eax
  183.         mov  rax, rdx
  184.         sal  rax, 4
  185.         sub  rax, rdx
  186.         sal  rax, 3
  187.         mov  rdx, rax
  188.         mov  rax, QWORD PTR -24[rbp]
  189.         add  rax, rdx
  190.         mov  rax, QWORD PTR [rax]
  191.         cmp  rcx, rax
  192.         jb  .L16
  193.         mov  edi, 32
  194.         call  putchar@PLT
  195.         mov  eax, r12d
  196.         movsx  rdx, eax
  197.         mov  rax, rdx
  198.         sal  rax, 4
  199.         sub  rax, rdx
  200.         sal  rax, 3
  201.         mov  rdx, rax
  202.         mov  rax, QWORD PTR -24[rbp]
  203.         add  rax, rdx
  204.         mov  rax, QWORD PTR 112[rax]
  205.         mov  rsi, rax
  206.         lea  rdi, .LC0[rip]
  207.         mov  eax, 0
  208.         call  printf@PLT
  209.         add  r12d, 1
  210. .L14:
  211.         mov  eax, r12d
  212.         cdqe
  213.         cmp  QWORD PTR -32[rbp], rax
  214.         ja  .L17
  215.         nop
  216.         nop
  217.         leave
  218.         ret
  219.  
  220. createDictionary:
  221.         push  rbp
  222.         mov  rbp, rsp
  223.         sub  rsp, 4096
  224.         or  QWORD PTR [rsp], 0
  225.         sub  rsp, 2064
  226.         mov  QWORD PTR -6152[rbp], rdi
  227.         mov  QWORD PTR -6040[rbp], 0
  228.         mov  rax, QWORD PTR -6152[rbp]
  229.         mov  rdi, rax
  230.         call  strlen@PLT
  231.         mov  QWORD PTR -32[rbp], rax
  232.         mov  BYTE PTR -1[rbp], 1
  233.         mov  QWORD PTR -16[rbp], 0
  234.         mov  r14d, 0
  235.         jmp  .L19
  236. .L27:
  237.         mov  eax, r14d
  238.         movsx  rdx, eax
  239.         mov  rax, QWORD PTR -6152[rbp]
  240.         add  rax, rdx
  241.         movzx  eax, BYTE PTR [rax]
  242.         cmp  al, 47
  243.         jle  .L20
  244.         mov  eax, r14d
  245.         movsx  rdx, eax
  246.         mov  rax, QWORD PTR -6152[rbp]
  247.         add  rax, rdx
  248.         movzx  eax, BYTE PTR [rax]
  249.         cmp  al, 57
  250.         jle  .L21
  251. .L20:
  252.         mov  eax, r14d
  253.         movsx  rdx, eax
  254.         mov  rax, QWORD PTR -6152[rbp]
  255.         add  rax, rdx
  256.         movzx  eax, BYTE PTR [rax]
  257.         cmp  al, 64
  258.         jle  .L22
  259.         mov  eax, r14d
  260.         movsx  rdx, eax
  261.         mov  rax, QWORD PTR -6152[rbp]
  262.         add  rax, rdx
  263.         movzx  eax, BYTE PTR [rax]
  264.         cmp  al, 90
  265.         jle  .L21
  266. .L22:
  267.         mov  eax, r14d
  268.         movsx  rdx, eax
  269.         mov  rax, QWORD PTR -6152[rbp]
  270.         add  rax, rdx
  271.         movzx  eax, BYTE PTR [rax]
  272.         cmp  al, 96
  273.         jle  .L23
  274.         mov  eax, r14d
  275.         movsx  rdx, eax
  276.         mov  rax, QWORD PTR -6152[rbp]
  277.         add  rax, rdx
  278.         movzx  eax, BYTE PTR [rax]
  279.         cmp  al, 122
  280.         jle  .L21
  281. .L23:
  282.         cmp  QWORD PTR -16[rbp], 0
  283.         je  .L24
  284.         mov  rcx, QWORD PTR -16[rbp]
  285.         lea  rdx, -6144[rbp]
  286.         lea  rsi, -6040[rbp]
  287.         lea rdi, -6032[rbp]
  288.         call  addToPairs
  289. .L24:
  290.         mov  BYTE PTR -1[rbp], 1
  291.         mov  QWORD PTR -16[rbp], 0
  292.         jmp  .L25
  293. .L21:
  294.         cmp  QWORD PTR -16[rbp], 0
  295.         jne  .L26
  296.         mov  eax, r14d
  297.         movsx  rdx, eax
  298.         mov  rax, QWORD PTR -6152[rbp]
  299.         add  rax, rdx
  300.         movzx  eax, BYTE PTR [rax]
  301.         cmp  al, 47
  302.         jle  .L26
  303.         mov  eax, r14d
  304.         movsx  rdx, eax
  305.         mov  rax, QWORD PTR -6152[rbp]
  306.         add  rax, rdx
  307.         movzx  eax, BYTE PTR [rax]
  308.         cmp  al, 57
  309.         jg  .L26
  310.         mov  BYTE PTR -1[rbp], 0
  311.         jmp  .L25
  312. .L26:
  313.         cmp  BYTE PTR -1[rbp], 0
  314.         je  .L25
  315.         mov  eax, r14d
  316.         movsx  rdx, eax
  317.         mov  rax, QWORD PTR -6152[rbp]
  318.         lea  rcx, [rdx+rax]
  319.         mov  rax, QWORD PTR -16[rbp]
  320.         lea  rdx, 1[rax]
  321.         mov  QWORD PTR -16[rbp], rdx
  322.         movzx  edx, BYTE PTR [rcx]
  323.         mov  BYTE PTR -6144[rbp+rax], dl
  324. .L25:
  325.         add  r14d, 1
  326. .L19:
  327.         mov  eax, r14d
  328.         cdqe
  329.         cmp  QWORD PTR -32[rbp], rax
  330.         ja  .L27
  331.         mov  rdx, QWORD PTR -6040[rbp]
  332.         lea  rax, -6032[rbp]
  333.         mov  rsi, rdx
  334.         mov  rdi, rax
  335.         call  printPairs
  336.         nop
  337.         leave
  338.         ret
  339.         .size  createDictionary, .-createDictionary
  340.         .globl  main
  341.         .type  main, @function
  342. main:
  343.         push  rbp                 # сохраняем rbp на стек
  344.         mov  rbp, rsp                # rbp := rsp
  345.         sub  rsp, 1008               # rsp -= 1008 (выделяем память для фрейма)
  346.         mov  rdx, QWORD PTR stdin[rip]
  347.         lea  rax, -1008[rbp]         # rax := rbp -1008
  348.         mov  esi, 1000               # esi := 1000
  349.         mov  rdi, rax                # rdi := rax
  350.         call  fgets@PLT           # вызов функции fgets
  351.         lea rdi, -1008[rbp]         # rdi := rbp - 1008
  352.         call  createDictionary    # вызов функции createDictionary
  353.         mov  eax, 0                  # возвращение в eax 0
  354.         leave                       # / выход из функции
  355.         ret                         # \
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement