fork download
  1. section .bss
  2.  
  3. x resd 1
  4.  
  5. m resb 0
  6.  
  7. section .text
  8.  
  9. global _start
  10.  
  11. out:
  12.  
  13. mov ecx, 32 ;счетчик цикла
  14.  
  15. xor r8, r8 ;кол-во битов
  16.  
  17. xor edx, edx
  18.  
  19. mov ebx, 1 ;регистр для получения текущего разряда
  20.  
  21. shl ebx, 31
  22.  
  23. .again:
  24.  
  25. mov esi, eax
  26.  
  27. and esi, ebx ;берем старший разряд в числе
  28.  
  29. shr esi, 31 ;получаем первую цифру числа
  30.  
  31. add esi, 48 ;переводим в char
  32.  
  33. mov [edi], esi ;записываем разряд в память
  34.  
  35. shl eax, 1
  36.  
  37. inc edi
  38.  
  39. inc edx
  40.  
  41. ;записали число в память
  42.  
  43. ;добавление символа пробела в память
  44.  
  45. cmp edx, 8 ; проверка условия
  46.  
  47. jnz .endif
  48.  
  49. cmp ecx, 32
  50.  
  51. jz .endif
  52.  
  53. mov esi, 32 ;добавление пробела
  54.  
  55. mov [edi], esi
  56.  
  57. inc edi
  58.  
  59. inc r8
  60.  
  61. xor edx, edx ;обнуление счетчика
  62.  
  63. .endif:
  64.  
  65. inc r8 ;добавляем 1 к общей длине числа
  66.  
  67. dec ecx
  68.  
  69. cmp ecx, 0 ;проверка условия цикла
  70.  
  71. jnz .again
  72.  
  73. mov byte [edi], 10 ;добавляем в конце перевод строки
  74.  
  75. mov byte [edi+1], 0 ; добавляем символ конца строки
  76.  
  77. add r8, 2
  78.  
  79. mov eax, 1 ;вывод числа на экран
  80.  
  81. mov edi, 1
  82.  
  83. mov esi, m ;начиная с этого адреса
  84.  
  85. mov rdx, r8 ; столько символов
  86.  
  87. syscall ;системный вызов syswrite
  88.  
  89. ret
  90.  
  91. main:
  92.  
  93. xor r9, r9
  94.  
  95. .for1: ;основной цикл сортировки пузырьком
  96.  
  97. xor ecx, ecx
  98.  
  99. .for2:
  100.  
  101. ;получаем первый байт
  102.  
  103. mov edx, 3
  104.  
  105. sub edx, ecx
  106.  
  107. push rax ;сохраняем значение rax чтобы не испортить его
  108.  
  109. mov eax, edx
  110.  
  111. xor edx, edx
  112.  
  113. mov r12, 8
  114.  
  115. mul r12
  116.  
  117. mov edx, eax
  118.  
  119. pop rax
  120.  
  121. mov edi, eax
  122.  
  123. push rcx
  124.  
  125. mov cl, dl
  126.  
  127. shr edi, cl
  128.  
  129. pop rcx
  130.  
  131. and edi, 0b11111111
  132.  
  133. ;получаем второй байт
  134.  
  135. mov edx, 2
  136.  
  137. sub edx, ecx
  138.  
  139. push rax
  140.  
  141. mov eax, edx
  142.  
  143. xor edx, edx
  144.  
  145. mov r12, 8
  146.  
  147. mul r12
  148.  
  149. mov edx, eax
  150.  
  151. pop rax
  152.  
  153. mov esi, eax
  154.  
  155. push rcx
  156.  
  157. mov cl, dl
  158.  
  159. shr esi, cl
  160.  
  161. pop rcx
  162.  
  163. and esi, 0b11111111
  164.  
  165. xor edx, edx ;cnt1
  166.  
  167. .while1:
  168.  
  169. cmp edi, 0
  170.  
  171. jz .endwhile1
  172.  
  173. inc edx
  174.  
  175. mov r10, rdi
  176.  
  177. dec r10
  178.  
  179. and rdi, r10
  180.  
  181. jmp .while1
  182.  
  183. .endwhile1:
  184.  
  185. xor ebx, ebx ;cnt2
  186.  
  187. .while2:
  188.  
  189. cmp esi, 0
  190.  
  191. jz .endwhile2
  192.  
  193. inc ebx
  194.  
  195. mov r10, rsi
  196.  
  197. dec r10
  198.  
  199. and rsi, r10
  200.  
  201. jmp .while2
  202.  
  203. .endwhile2:
  204.  
  205. ;Побитово переписваиваем байты
  206.  
  207. cmp ebx, edx ;сравниваем ранги байтов
  208.  
  209. jng .endif1 ;если сравнение <= не выполнено переходим в конец условия
  210.  
  211. mov edx, 3 ;вычисляем с какого значения надо стартовать цикл для смены битов в байте
  212.  
  213. sub edx, ecx
  214.  
  215. push rax
  216.  
  217. mov eax, edx
  218.  
  219. xor edx, edx
  220.  
  221. mov r12, 8
  222.  
  223. mul r12
  224.  
  225. mov edx, eax
  226.  
  227. pop rax
  228.  
  229. mov r10, rdx ;счетчик цикла
  230.  
  231. mov r11, r10 ;цикл выполняется пока счетчик меньше этого значения
  232.  
  233. add r11, 8
  234.  
  235. .for3:
  236.  
  237. mov rsi, r10 ;получаем номера двух битов, n1
  238.  
  239. mov rdi, r10 ;n2
  240.  
  241. sub rdi, 8
  242.  
  243. mov ebx, eax ;получаем бит с номером n1
  244.  
  245. push rcx
  246.  
  247. mov ecx, esi
  248.  
  249. shr ebx, cl
  250.  
  251. pop rcx
  252.  
  253. mov edx, ebx
  254.  
  255. mov ebx, eax ;получаем бит с номером n2
  256.  
  257. push rcx
  258.  
  259. mov ecx, edi
  260.  
  261. shr ebx, cl
  262.  
  263. pop rcx
  264.  
  265. and edx, 1 ;получаем значение нужного бита
  266.  
  267. and ebx, 1
  268.  
  269. cmp edx, ebx ;условия того что два бита не равны
  270.  
  271. jz .endif3
  272.  
  273. mov ebx, 1 ;вычисляем смещение для инвертирования значения бита 1
  274.  
  275. push rcx
  276.  
  277. mov ecx, esi
  278.  
  279. shl ebx, cl
  280.  
  281. pop rcx
  282.  
  283. mov edx, ebx
  284.  
  285. mov ebx, 1 ;вычисляем смещение для инвертирования значения бита 2
  286.  
  287. push rcx
  288.  
  289. mov ecx, edi
  290.  
  291. shl ebx, cl
  292.  
  293. pop rcx
  294.  
  295. xor eax, edx ;инвертируем биты если они не равны
  296.  
  297. xor eax, ebx
  298.  
  299. .endif3:
  300.  
  301. inc r10
  302.  
  303. cmp r10, r11 ;проверка условия for3
  304.  
  305. jnz .for3
  306.  
  307. .endif1:
  308.  
  309. inc ecx
  310.  
  311. cmp ecx, 3 ;проверка условия for2
  312.  
  313. jnz .for2
  314.  
  315. inc r9
  316.  
  317. cmp r9, 3 ;проверка условия for1
  318.  
  319. jnz .for1
  320.  
  321. ret
  322.  
  323. _start:
  324.  
  325. rdtsc
  326.  
  327. mov[x], eax
  328.  
  329. mov eax, [x]
  330.  
  331. mov edi, m
  332.  
  333. call out
  334.  
  335. mov eax, [x]
  336.  
  337. call main
  338.  
  339. mov edi, m
  340.  
  341. call out
  342.  
  343. mov eax, 60
  344.  
  345. xor edi, edi
  346.  
  347. syscall
Success #stdin #stdout 0s 5368KB
stdin
Standard input is empty
stdout
01111001 11110110 10011010 11010010 
11110110 01111001 10011010 11010010