fork download
  1. section .data
  2. ; Пример чисел разных размеров
  3. byte_num1 db -50
  4. byte_num2 db 100
  5. word_num1 dw -1000
  6. word_num2 dw 2000
  7. dword_num1 dd -50000
  8. dword_num2 dd 100000
  9. qword_num1 dq -5000000
  10. qword_num2 dq 10000000
  11.  
  12. result dq 0
  13.  
  14. ; Сообщения
  15. msg_title db "Сложение знаковых чисел", 10
  16. db "========================", 10, 10, 0
  17. msg_byte db "1) Сложение байтов (-50 + 100): ", 0
  18. msg_word db "2) Сложение слов (-1000 + 2000): ", 0
  19. msg_dword db "3) Сложение двойных слов (-50000 + 100000): ", 0
  20. msg_qword db "4) Сложение учетверенных слов (-5000000 + 10000000): ", 0
  21. msg_equal db " = ", 0
  22. newline db 10, 0
  23.  
  24. section .bss
  25. buffer resb 21
  26.  
  27. section .text
  28. global _start
  29.  
  30. _start:
  31. ; Вывод заголовка
  32. mov rdi, msg_title
  33. call print_string
  34.  
  35. ; 1. Сложение байтов (1 байт)
  36. mov rdi, msg_byte
  37. call print_string
  38.  
  39. movsx rax, byte [byte_num1]
  40. movsx rbx, byte [byte_num2]
  41. add rax, rbx
  42. mov [result], rax
  43.  
  44. ; Вывод первого числа
  45. movsx rax, byte [byte_num1]
  46. call print_number
  47. mov rdi, msg_equal
  48. call print_string
  49. ; Вывод второго числа
  50. movsx rax, byte [byte_num2]
  51. call print_number
  52. mov rdi, msg_equal
  53. call print_string
  54. ; Вывод результата
  55. mov rax, [result]
  56. call print_number
  57. mov rdi, newline
  58. call print_string
  59.  
  60. ; 2. Сложение слов (2 байта)
  61. mov rdi, msg_word
  62. call print_string
  63.  
  64. movsx rax, word [word_num1]
  65. movsx rbx, word [word_num2]
  66. add rax, rbx
  67. mov [result], rax
  68.  
  69. ; Вывод первого числа
  70. movsx rax, word [word_num1]
  71. call print_number
  72. mov rdi, msg_equal
  73. call print_string
  74. ; Вывод второго числа
  75. movsx rax, word [word_num2]
  76. call print_number
  77. mov rdi, msg_equal
  78. call print_string
  79. ; Вывод результата
  80. mov rax, [result]
  81. call print_number
  82. mov rdi, newline
  83. call print_string
  84.  
  85. ; 3. Сложение двойных слов (4 байта)
  86. mov rdi, msg_dword
  87. call print_string
  88.  
  89. movsxd rax, dword [dword_num1]
  90. movsxd rbx, dword [dword_num2]
  91. add rax, rbx
  92. mov [result], rax
  93.  
  94. ; Вывод первого числа
  95. movsxd rax, dword [dword_num1]
  96. call print_number
  97. mov rdi, msg_equal
  98. call print_string
  99. ; Вывод второго числа
  100. movsxd rax, dword [dword_num2]
  101. call print_number
  102. mov rdi, msg_equal
  103. call print_string
  104. ; Вывод результата
  105. mov rax, [result]
  106. call print_number
  107. mov rdi, newline
  108. call print_string
  109.  
  110. ; 4. Сложение учетверенных слов (8 байт)
  111. mov rdi, msg_qword
  112. call print_string
  113.  
  114. mov rax, [qword_num1]
  115. mov rbx, [qword_num2]
  116. add rax, rbx
  117. mov [result], rax
  118.  
  119. ; Вывод первого числа
  120. mov rax, [qword_num1]
  121. call print_number
  122. mov rdi, msg_equal
  123. call print_string
  124. ; Вывод второго числа
  125. mov rax, [qword_num2]
  126. call print_number
  127. mov rdi, msg_equal
  128. call print_string
  129. ; Вывод результата
  130. mov rax, [result]
  131. call print_number
  132. mov rdi, newline
  133. call print_string
  134.  
  135. ; Завершение программы
  136. mov rax, 60
  137. xor rdi, rdi
  138. syscall
  139.  
  140. ; Вывод числа из RAX
  141. print_number:
  142. push rax
  143. push rbx
  144. push rcx
  145. push rdx
  146. push rdi
  147. push rsi
  148.  
  149. mov rdi, buffer
  150. call int64_to_string
  151. call print_string
  152.  
  153. pop rsi
  154. pop rdi
  155. pop rdx
  156. pop rcx
  157. pop rbx
  158. pop rax
  159. ret
  160.  
  161. ; Преобразование числа в строку (упрощенная версия)
  162. int64_to_string:
  163. push rbx
  164. push rcx
  165. push rdx
  166. push rdi
  167.  
  168. test rax, rax
  169. jns .positive
  170. mov byte [rdi], '-'
  171. inc rdi
  172. neg rax
  173.  
  174. .positive:
  175. mov rbx, 10
  176. mov rcx, 0
  177.  
  178. .digit_loop:
  179. xor rdx, rdx
  180. div rbx
  181. add dl, '0'
  182. push rdx
  183. inc rcx
  184. test rax, rax
  185. jnz .digit_loop
  186.  
  187. .pop_digits:
  188. pop rax
  189. mov [rdi], al
  190. inc rdi
  191. loop .pop_digits
  192.  
  193. mov byte [rdi], 0
  194. pop rdi
  195. pop rdx
  196. pop rcx
  197. pop rbx
  198. ret
  199.  
  200. ; Вывод строки
  201. print_string:
  202. push rax
  203. push rdi
  204. push rsi
  205. push rdx
  206. push rcx
  207.  
  208. mov rsi, rdi
  209. mov rcx, 0
  210. .length_loop:
  211. cmp byte [rsi], 0
  212. je .print
  213. inc rsi
  214. inc rcx
  215. jmp .length_loop
  216.  
  217. .print:
  218. mov rax, 1
  219. mov rdi, 1
  220. mov rdx, rcx
  221. syscall
  222.  
  223. pop rcx
  224. pop rdx
  225. pop rsi
  226. pop rdi
  227. pop rax
  228. ret
Success #stdin #stdout 0.01s 5300KB
stdin
Standard input is empty
stdout
1) Сложение байтов (-50 + 100): 2) Сложение с�2) Сложение слов (-1000 + 2000): 

3) Сложение двойных слов 

4) Сложение учетверенных слов (-500000

 = 
50000