fork download
  1. section .data
  2. ; 1. Создать переменную с текстом «Assembler – low level programming»
  3. text_var db 'Assembler – low level programming', 0xA, 0
  4. text_len equ $ - text_var
  5.  
  6. ; 2. Создать переменную со значением 40
  7. var1 dd 40
  8.  
  9. ; 3. Создать переменную со значением 36
  10. var2 dd 36
  11.  
  12. newline db 0xA ; символ новой строки
  13. space db ' ' ; пробел
  14.  
  15. ; Текстовые метки для вывода
  16. msg_sub db 'Subtraction (40 - 36): '
  17. msg_sub_len equ $ - msg_sub
  18.  
  19. msg_add db 'Addition (40 + 36): '
  20. msg_add_len equ $ - msg_add
  21.  
  22. msg_add_imm db 'Add immediate (40 + 15): '
  23. msg_add_imm_len equ $ - msg_add_imm
  24.  
  25. msg_sub_imm db 'Subtract immediate (40 - 10): '
  26. msg_sub_imm_len equ $ - msg_sub_imm
  27.  
  28. section .bss
  29. result resd 1
  30. buffer resb 10 ; буфер для преобразования числа в строку
  31.  
  32. section .text
  33. global _start
  34.  
  35. _start:
  36. ; Выводим исходный текст
  37. mov eax, 4
  38. mov ebx, 1
  39. mov ecx, text_var
  40. mov edx, text_len
  41. int 0x80
  42.  
  43. call print_newline
  44.  
  45. ; 4. Вычесть из первой вторую (40 - 36 = 4)
  46. mov eax, [var1]
  47. sub eax, [var2]
  48. mov [result], eax
  49.  
  50. ; Выводим результат вычитания
  51. mov eax, 4
  52. mov ebx, 1
  53. mov ecx, msg_sub
  54. mov edx, msg_sub_len
  55. int 0x80
  56.  
  57. mov eax, [result]
  58. call print_number
  59. call print_newline
  60.  
  61. ; 5. Сложить первую со второй (40 + 36 = 76)
  62. mov eax, [var1]
  63. add eax, [var2]
  64. mov [result], eax
  65.  
  66. ; Выводим результат сложения
  67. mov eax, 4
  68. mov ebx, 1
  69. mov ecx, msg_add
  70. mov edx, msg_add_len
  71. int 0x80
  72.  
  73. mov eax, [result]
  74. call print_number
  75. call print_newline
  76.  
  77. ; 6. Сложить любое непосредственное значение с первой переменной (40 + 15 = 55)
  78. mov eax, [var1]
  79. add eax, 15
  80. mov [result], eax
  81.  
  82. ; Выводим результат сложения с непосредственным значением
  83. mov eax, 4
  84. mov ebx, 1
  85. mov ecx, msg_add_imm
  86. mov edx, msg_add_imm_len
  87. int 0x80
  88.  
  89. mov eax, [result]
  90. call print_number
  91. call print_newline
  92.  
  93. ; 7. Вычесть из первой переменной любое непосредственное значение (40 - 10 = 30)
  94. mov eax, [var1]
  95. sub eax, 10
  96. mov [result], eax
  97.  
  98. ; Выводим результат вычитания непосредственного значения
  99. mov eax, 4
  100. mov ebx, 1
  101. mov ecx, msg_sub_imm
  102. mov edx, msg_sub_imm_len
  103. int 0x80
  104.  
  105. mov eax, [result]
  106. call print_number
  107. call print_newline
  108.  
  109. ; Завершение программы
  110. mov eax, 1
  111. xor ebx, ebx
  112. int 0x80
  113.  
  114. ; Функция для вывода числа из EAX
  115. print_number:
  116. mov edi, buffer + 9 ; указатель на конец буфера
  117. mov byte [edi], 0 ; нулевой терминатор
  118. mov ebx, 10 ; делитель для десятичной системы
  119.  
  120. .convert_loop:
  121. xor edx, edx ; обнуляем EDX для деления
  122. div ebx ; делим EAX на 10, результат в EAX, остаток в EDX
  123. add dl, '0' ; преобразуем цифру в символ
  124. dec edi ; двигаемся назад в буфере
  125. mov [edi], dl ; сохраняем символ
  126. test eax, eax ; проверяем, не ноль ли EAX
  127. jnz .convert_loop ; если не ноль, продолжаем
  128.  
  129. ; Выводим число
  130. mov eax, 4
  131. mov ebx, 1
  132. mov ecx, edi ; указатель на начало строки с числом
  133. mov edx, buffer + 10 ; вычисляем длину
  134. sub edx, edi
  135. int 0x80
  136. ret
  137.  
  138. ; Функция для вывода новой строки
  139. print_newline:
  140. mov eax, 4
  141. mov ebx, 1
  142. mov ecx, newline
  143. mov edx, 1
  144. int 0x80
  145. ret
Success #stdin #stdout 0s 5328KB
stdin
Standard input is empty
stdout
Assembler – low level programming

Subtraction (40 - 36): 4
Addition (40 + 36): 76
Add immediate (40 + 15): 55
Subtract immediate (40 - 10): 30