fork download
  1. section .data
  2. arr dw 10, 25, 33, 47, 58 ; массив из 5 чисел
  3. len equ ($ - arr) / 2
  4. msg db "Результат: ", 0
  5.  
  6. section .bss
  7. buffer resb 20 ; буфер для числа
  8.  
  9. section .text
  10. global _start
  11.  
  12. _start:
  13. ; --- Вычисление разницы ---
  14. movzx eax, word [arr] ; первый элемент
  15. movzx ebx, word [arr + (len - 1) * 2] ; последний элемент
  16. sub eax, ebx ; разница = первый - последний
  17.  
  18. ; --- Вывод "Результат: " ---
  19. mov rdi, msg
  20. call print_string
  21.  
  22. ; --- Преобразование и вывод числа ---
  23. mov rdi, rax
  24. call print_int
  25.  
  26. ; --- Новая строка ---
  27. mov rdi, 10
  28. call print_char
  29.  
  30. ; --- Выход ---
  31. mov rax, 60 ; sys_exit
  32. xor rdi, rdi ; код 0
  33. syscall
  34.  
  35. ; === Подпрограмма: вывод строки (rdi = адрес строки, завершённой нулём) ===
  36. print_string:
  37. push rax
  38. push rbx
  39. push rcx
  40. push rdx
  41. mov rcx, rdi
  42. xor rdx, rdx
  43. .strlen_loop:
  44. cmp byte [rcx + rdx], 0
  45. je .got_len
  46. inc rdx
  47. jmp .strlen_loop
  48. .got_len:
  49. mov rax, 1 ; sys_write
  50. mov rdi, 1 ; stdout
  51. mov rsi, rcx
  52. ; rdx уже содержит длину
  53. syscall
  54. pop rdx
  55. pop rcx
  56. pop rbx
  57. pop rax
  58. ret
  59.  
  60. ; === Подпрограмма: вывод одного символа (rdi = символ) ===
  61. print_char:
  62. push rax
  63. push rdi
  64. mov [buffer], dil
  65. mov rax, 1
  66. mov rdi, 1
  67. mov rsi, buffer
  68. mov rdx, 1
  69. syscall
  70. pop rdi
  71. pop rax
  72. ret
  73.  
  74. ; === Подпрограмма: вывод целого числа (rdi = число) ===
  75. print_int:
  76. push rax
  77. push rbx
  78. push rcx
  79. push rdx
  80. push rdi
  81.  
  82. mov rax, rdi ; число в rax
  83. cmp rax, 0
  84. jge .positive
  85.  
  86. ; Если отрицательное — выводим минус и делаем положительным
  87. mov dil, '-'
  88. call print_char
  89. neg rax
  90.  
  91. .positive:
  92. mov rbx, 10
  93. mov rcx, buffer + 19
  94. mov byte [rcx], 0 ; завершаем строку нулём
  95. dec rcx
  96.  
  97. .digit_loop:
  98. xor rdx, rdx
  99. div rbx ; rax = rax / 10, rdx = остаток
  100. add dl, '0'
  101. mov [rcx], dl
  102. dec rcx
  103. test rax, rax
  104. jnz .digit_loop
  105.  
  106. ; rcx+1 — начало строки цифр
  107. mov rdi, rcx
  108. inc rdi
  109. call print_string
  110.  
  111. pop rdi
  112. pop rdx
  113. pop rcx
  114. pop rbx
  115. pop rax
  116. ret
Success #stdin #stdout 0s 5320KB
stdin
Standard input is empty
stdout
Результат: 4294967248