Advertisement
_takumi

idz2_for7_undivided

Nov 3rd, 2022 (edited)
1,883
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     .intel_syntax noprefix
  2.     .text
  3.     .globl  solve
  4.     .type   solve, @function
  5. solve:
  6.     push    rbp
  7.     mov rbp, rsp
  8.     sub rsp, 48
  9.         push     rbx
  10.         push     r10
  11.         push     r12
  12.         push     r13
  13.         push     r14
  14.         push     r15
  15.  
  16.     #mov    QWORD PTR -16[rbp], rdi # pass pointer to s into rbp-16
  17.     mov r10, rdi # pass pointer to s into r10
  18.     #mov    QWORD PTR -40[rbp], rsi # pass n into rbp-40
  19.     mov r12, rsi # pass n into r12
  20.     mov QWORD PTR -16[rbp], rdx # pass output into rcx
  21.  
  22.     #mov    QWORD PTR -32[rbp], 0 # p1
  23.     mov r13, 0 # p1
  24.         cmp     r12, 1
  25.         jne     .L17
  26.         mov     r13, rdi
  27. .L17:
  28.     add rdi, r12 # rdi = s + n #-40
  29.     #mov    QWORD PTR -24[rbp], rdi # rbp-24 = p2 = s + n
  30.     mov r14, rdi # r14 = p2 = s + n
  31.  
  32.    
  33.     #mov    DWORD PTR -48[rbp], eax # rbp-48 = i = n-1
  34.         mov rbx, r12
  35.     dec rbx# rbx = i = n-1
  36.     jmp .L4
  37. .L9:
  38.     lea rdx, -1[rbx]
  39.     mov rax, r10 # rax = s
  40.     add rax, rdx
  41.     movzx   edx, BYTE PTR [rax] # edx = s[i-1]
  42.     mov rax, rbx
  43.     add rax, r10
  44.     movzx   eax, BYTE PTR [rax] # rax = s[i]
  45.     cmp dl, al # if (s[i - 1] < s[i])
  46.     jge .L5
  47.     lea r13, -1[rbx]
  48.     add r13, r10 # p1 = s + i - 1
  49.     jmp .L6
  50. .L5: # else
  51.     cmp r13, 0 # if (p1 != NULL)
  52.     jne .L8 # break
  53.     mov r14, rbx
  54.     add r14, r10 # p2 = s + i
  55. .L6:
  56.     dec rbx # --i
  57. .L4:
  58.     cmp rbx, 0
  59.     jg  .L9
  60. .L8:
  61.         cmp      r13, 0
  62.         je      .L15
  63.     #mov    QWORD PTR -8[rbp], 0 # i = 0
  64.     mov r15, 0 # i = 0
  65.     jmp .L10
  66. .L11:
  67.     lea rax, [r15+r13]
  68.     movzx   eax, BYTE PTR [rax]
  69.     movsx   eax, al
  70.     mov edi, eax # arg1=p1[i]
  71.     mov rsi, QWORD PTR -16[rbp] # arg2=output
  72.     call    fputc@PLT # fputc=fprintf("%c",...)
  73.     inc r15
  74. .L10:
  75.     lea rax, [r13+r15]
  76.     cmp r14, rax
  77.     jne .L11
  78. .L15:
  79.     pop      r15
  80.     pop      r14
  81.     pop      r13
  82.     pop      r12
  83.     pop      r10
  84.     pop      rbx
  85.  
  86.     leave
  87.     ret
  88.     .size   solve, .-solve
  89.     .section    .rodata
  90. .LC0:
  91.     .string "%lld"
  92. .LC1:
  93.     .string "r"
  94. .LC2:
  95.     .string "w"
  96.     .text
  97.     .globl  main
  98.     .type   main, @function
  99. main:
  100.     mov %rbp, %rsp #for correct debugging
  101.     push    rbp
  102.     mov rbp, rsp
  103.     sub rsp, 64
  104.  
  105.         mov      QWORD PTR -64[rbp], rsi
  106.  
  107.     mov rdi, QWORD PTR -64[rbp]
  108.         add      rdi, 8
  109.     mov rdi, QWORD PTR [rdi]
  110.     lea rsi, .LC1[rip]
  111.     call    fopen@PLT
  112.     mov r13, rax
  113.  
  114.     mov rdi, QWORD PTR -64[rbp]
  115.         add      rdi, 16
  116.     mov rdi, QWORD PTR [rdi]
  117.     lea rsi, .LC2[rip]
  118.     call    fopen@PLT
  119.     mov r14, rax
  120.  
  121.     mov QWORD PTR -40[rbp], 0 # rbp-40 is n
  122.     lea rdx, -40[rbp]
  123.     lea rsi, .LC0[rip]
  124.     mov rdi, r13
  125.     mov eax, 0
  126.     call    __isoc99_fscanf@PLT
  127.     mov rax, QWORD PTR -40[rbp] # rax = n
  128.     add rax, 1 # rax = n+1
  129.     mov rdi, rax # malloc argument is n+1 - the size of the string s in bytes
  130.     call    malloc@PLT
  131.     #mov    QWORD PTR -16[rbp], rax # rbp-16 = s
  132.     mov rbx, rax # rbx = s
  133.     mov rdi, r13
  134.     call    fgetc@PLT
  135.     #mov    QWORD PTR -52[rbp], 0 # rbp-52 = i = 0
  136.     mov rdx, r13
  137.     mov rax, QWORD PTR -40[rbp]
  138.     lea rsi, [rax+1]
  139.     mov rdi, rbx
  140.     call    fgets@PLT
  141.  
  142.     mov rdx, r14
  143.     mov rsi, QWORD PTR -40[rbp] # rsi = n
  144.     mov rdi, rbx # rdi = s
  145.     call    solve
  146.     mov     rdi, r13
  147.     call    fclose@PLT
  148.     mov     rdi, r14
  149.     call    fclose@PLT
  150.     mov eax, 0
  151.     leave
  152.     ret
  153.     .size   main, .-main
  154.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement