fork download
  1. section .bss
  2.  
  3. x resq 1 ;пригодится для вывода
  4.  
  5. section .data
  6.  
  7. n dq 0xABC8547F ; наше число
  8.  
  9. section .text ; начинаем программу
  10.  
  11. global _start
  12.  
  13. start:
  14.  
  15. mov r10, [n] ;запишем число в регистр
  16.  
  17. mov rdi, r10 ;передадим его как параметр через rdi
  18.  
  19. call print_bin ;и выведем
  20.  
  21. mov rdi, r10 ;rdi - параметр вызываемой функции
  22.  
  23. call find_max_tetrade;найдём максимальную тетраду
  24.  
  25. mov rdi, r10 ;первый параметр
  26.  
  27. mov rsi, rax ;второй параметр
  28.  
  29. call all_xor ;преобразуем число
  30.  
  31. mov rdi, rax ;результат функции в rax
  32.  
  33. call print_bin ;выведем его
  34.  
  35. call the_end ;без комментарием
  36.  
  37. all_xor:
  38.  
  39. ;нужно rsi сксорить со всеми чётными тетрадами rdi
  40.  
  41. mov r8, rdi ;r8 понадобится для проверки чётности
  42.  
  43. while4: ;пуск цикла
  44.  
  45. mov r9, r8 ;с помощью r9 проверим чётность последней тетрады r8
  46.  
  47. and r9, 1
  48.  
  49. jnz if2 ;если тетрада нечётна, пропустим следующую операцию
  50.  
  51. xor rdi, rsi; xor двух параметров функции
  52.  
  53. if2:
  54.  
  55. shr r8, 4 ;сдвинем r8, что бы перейти к следующей тетраде
  56.  
  57. shl rsi, 4 ;сдивнем rsi, что бы ксорить уже с другой тетрадой
  58.  
  59. cmp esi, 0 ;если в последний 32-ух битах rsi одни нули - мы закончили
  60.  
  61. jnz while4
  62.  
  63. mov rax, rdi ;закинуть результат преобразования в rax
  64.  
  65. ret ;выход из функции
  66.  
  67. find_max_tetrade: ;Найдём максимальную тетраду в параметре rdi
  68.  
  69. mov r8, 0 ;текущий максимум храним в r8
  70.  
  71. while3: ;старт цикла
  72.  
  73. mov r9, rdi ;последняя тетрада rdi окажется в r9
  74.  
  75. and r9, 0xF
  76.  
  77. cmp r9, r8
  78.  
  79. js if1 ;если r9 < r8, пропустим присваивание r8 значение r9
  80.  
  81. mov r8, r9
  82.  
  83. if1:
  84.  
  85. shr rdi, 4 ;сдвинем rdi для перехода к следующей тетраде
  86.  
  87. jnz while3 ;закончим цикл, если rdi равен 0
  88.  
  89. mov rax, r8 ;закинем результат (максимум) в rax
  90.  
  91. ret
  92.  
  93. print_bin: ;выведем число на экран
  94.  
  95. push 10 ;закинем в стек символ переноса строкм
  96.  
  97. mov r9, 32 ;r9 - счётчик цикла (loop не работает)
  98.  
  99. while1:
  100.  
  101. mov r8, rdi ;в r8 будет последний бит rdi
  102.  
  103. and r8, 1
  104.  
  105. add r8, '0' ;прибавим ascii код нуля
  106.  
  107. push r8 ;и закинем очередной символ в стек
  108.  
  109. shr rdi, 1 ;сдвинем rdi, для перехода к следующему биту
  110.  
  111. dec r9 ;уменьшим счётчик и проверим
  112.  
  113. jnz while1
  114.  
  115. mov rax, 1 ;подготовим регистры к вызову syscall
  116.  
  117. mov rdi, 1
  118.  
  119. mov rsi, x
  120.  
  121. mov rdx, 1
  122.  
  123. mov r9, 33 ;выводим 33 символа - 32 бита и перенос строки
  124.  
  125. while2:
  126.  
  127. pop qword[x] ;достаём символ из стека в ячейку памяти номер x
  128.  
  129. syscall ;выводим символ
  130.  
  131. dec r9 ;уменьшаем счётчик и проверяем
  132.  
  133. jnz while2
  134.  
  135. ret
  136.  
  137. the_end: ;решил написать отдельную функцию для завершения
  138.  
  139. mov rax, 60 ;60 - системный вызов команды завершения
  140.  
  141. mov rdi, 0 ;0 - возвращаемое значение
  142.  
  143. syscall ;завершение кода
  144.  
  145. ret ;пусть будет - для приличия
Success #stdin #stdout 0s 5352KB
stdin
Standard input is empty
stdout
10101011110010000101010001111111
01011011001101110101101101111111