Вычислите значение кусочной функции - Assembler/FASM

Узнай цену своей работы

Формулировка задачи:

F(x) =

x, если x < 0 x/2, если 0 <= x <= 3 x-5, если x > 3 Программа работает, но в диапазоне от 0 до 3 нужно вывести результат деления. Помогите вывести в результате число с остатком.
Листинг программы
  1. use16
  2. org 100h
  3. mov ax, [x]
  4. CMP ax , 0
  5. JL @Ext ; x < 0
  6. CMP ax, 3
  7. JG @m2 ; x > 3
  8. CMP ax, 3
  9. JLE @m1 ; x <= 3
  10. CMP ax, 0
  11. JGE @m1 ; x >= 0
  12. @m1:
  13. mov bl, 2
  14. div bl
  15. jmp @Ext
  16. @m2:
  17. sub ax, 5
  18. jmp @Ext
  19.  
  20. @Ext:
  21. mov [ f ] , ax
  22. mov ax, [ f ] ;Число, которое будем выводить
  23. mov cx,print_str ;Адрес процедуры print_str
  24. mov bx,print_endline ;Адрес процедуры print_endline
  25. mov di,x1_x
  26. call cx ;Вывод строки 'signed byte :'
  27. call bx ;Вывод конца строки
  28. mov di,x2_x
  29. call cx ;Вывод строки 'signed byte :'
  30. call bx ;Вывод конца строки
  31. mov di,x3_x
  32. call cx ;Вывод строки 'signed byte :'
  33. call bx ;Вывод конца строки
  34. mov di,x_x
  35. call cx ;Вывод строки 'signed byte :'
  36. call print_byte_sdec ;Вывод AL в десятичном виде (со знаком)
  37. call bx ;Вывод конца строки
  38.  
  39. mov ax, [ x ] ;Число, которое будем выводить
  40. mov cx,print_str ;Адрес процедуры print_str
  41. mov bx,print_endline ;Адрес процедуры print_endline
  42.  
  43. mov di,s_sbyte
  44. call cx ;Вывод строки 'signed byte :'
  45. call print_byte_sdec ;Вывод AL в десятичном виде (со знаком)
  46. call bx ;Вывод конца строки
  47. mov di,s_pak
  48. call cx ;Вывод строки 'Press any key...'
  49. mov ah,8 ;Функция DOS 08h - ввод символа без эха
  50. int 21h
  51. mov ax,4C00h ;\
  52. int 21h ;/ Завершение программы
  53. ;----------------------------------------------------------------------
  54. ;Процедура вывода байта на консоль в десятичном виде (без знака)
  55. ; AL - байт
  56. print_byte_udec:
  57. push di
  58. mov di,buffer ;DI = адрес буфера
  59. push di ;Сохранение DI в стеке
  60. call byte_to_udec_str ;Преобразование байта в AL в строку
  61. mov byte[di],'$' ;Добавление символа конца строки
  62. pop di ;DI = адрес начала строки
  63. call print_str ;Вывод строки на консоль
  64. pop di
  65. ret
  66. ;----------------------------------------------------------------------
  67. ;Процедура вывода слова на консоль в десятичном виде (без знака)
  68. ; AX - слово
  69. print_word_udec:
  70. push di
  71. mov di,buffer ;DI = адрес буфера
  72. push di ;Сохранение DI в стеке
  73. call word_to_udec_str ;Преобразование слова в AX в строку
  74. mov byte[di],'$' ;Добавление символа конца строки
  75. pop di ;DI = адрес начала строки
  76. call print_str ;Вывод строки на консоль
  77. pop di
  78. ret
  79. ;----------------------------------------------------------------------
  80. ;Процедура вывода байта на консоль в десятичном виде (со знаком)
  81. ; AL - байт
  82. print_byte_sdec:
  83. push di
  84. mov di,buffer ;DI = адрес буфера
  85. push di ;Сохранение DI в стеке
  86. call byte_to_sdec_str ;Преобразование байта в AL в строку
  87. mov byte[di],'$' ;Добавление символа конца строки
  88. pop di ;DI = адрес начала строки
  89. call print_str ;Вывод строки на консоль
  90. pop di
  91. ret
  92. ;----------------------------------------------------------------------
  93. ;Процедура вывода слова на консоль в десятичном виде (со знаком)
  94. ; AX - слово
  95. print_word_sdec:
  96. push di
  97. mov di,buffer ;DI = адрес буфера
  98. push di ;Сохранение DI в стеке
  99. call word_to_sdec_str ;Преобразование слова в AX в строку
  100. mov byte[di],'$' ;Добавление символа конца строки
  101. pop di ;DI = адрес начала строки
  102. call print_str ;Вывод строки на консоль
  103. pop di
  104. ret
  105. ;----------------------------------------------------------------------
  106. ;Процедура вывода строки на консоль
  107. ; DI - адрес строки
  108. print_str:
  109. push ax
  110. mov ah,9 ;Функция DOS 09h - вывод строки
  111. xchg dx,di ;Обмен значениями DX и DI
  112. int 21h ;Обращение к функции DOS
  113. xchg dx,di ;Обмен значениями DX и DI
  114. pop ax
  115. ret
  116. ;----------------------------------------------------------------------
  117. ;Процедура вывода конца строки (CR+LF)
  118. print_endline:
  119. push di
  120. mov di,endline ;DI = адрес строки с символами CR,LF
  121. call print_str ;Вывод строки на консоль
  122. pop di
  123. ret
  124. ;----------------------------------------------------------------------
  125. ;Процедура преобразования байта в строку в десятичном виде (без знака)
  126. ; AL - байт.
  127. ; DI - буфер для строки (3 символа). Значение регистра не сохраняется.
  128. byte_to_udec_str:
  129. push ax
  130. xor ah,ah ;Преобразование байта в слово (без знака)
  131. call word_to_udec_str ;Вызов процедуры для слова без знака
  132. pop ax
  133. ret
  134. ;----------------------------------------------------------------------
  135. ;Процедура преобразования слова в строку в десятичном виде (без знака)
  136. ; AX - слово
  137. ; DI - буфер для строки (5 символов). Значение регистра не сохраняется.
  138. word_to_udec_str:
  139. push ax
  140. push cx
  141. push dx
  142. push bx
  143. xor cx,cx ;Обнуление CX
  144. mov bx,10 BX делитель (10 для десятичной системы)
  145. wtuds_lp1: ;Цикл получения остатков от деления
  146. xor dx,dx ;Обнуление старшей части двойного слова
  147. div bx ;Деление AX=(DX:AX)/BX, остаток в DX
  148. add dl,'0' ;Преобразование остатка в код символа
  149. push dx ;Сохранение в стеке
  150. inc cx ;Увеличение счетчика символов
  151. test ax,ax ;Проверка AX
  152. jnz wtuds_lp1 ;Переход к началу цикла, если частное не 0.
  153. wtuds_lp2: ;Цикл извлечения символов из стека
  154. pop dx ;Восстановление символа из стека
  155. mov [di],dl ;Сохранение символа в буфере
  156. inc di ;Инкремент адреса буфера
  157. loop wtuds_lp2 ;Команда цикла
  158. pop bx
  159. pop dx
  160. pop cx
  161. pop ax
  162. ret
  163. ;----------------------------------------------------------------------
  164. ;Процедура преобразования байта в строку в десятичном виде (со знаком)
  165. ; AL - байт.
  166. ; DI - буфер для строки (4 символа). Значение регистра не сохраняется.
  167. byte_to_sdec_str:
  168. push ax
  169. movsx ax,al ;Преобразование байта в слово (со знаком)
  170. call word_to_sdec_str ;Вызов процедуры для слова со знаком
  171. pop ax
  172. ret
  173. ;----------------------------------------------------------------------
  174. ;Процедура преобразования слова в строку в десятичном виде (со знаком)
  175. ; AX - слово
  176. ; DI - буфер для строки (6 символов). Значение регистра не сохраняется.
  177. word_to_sdec_str:
  178. push ax
  179. test ax,ax ;Проверка знака AX
  180. jns wtsds_no_sign ;Если >= 0, преобразуем как беззнаковое
  181. mov byte[di],'-' ;Добавление знака в начало строки
  182. inc di ;Инкремент DI
  183. neg ax ;Изменение знака значения AX
  184. wtsds_no_sign:
  185. call word_to_udec_str ;Преобразование беззнакового значения
  186. pop ax
  187. ret
  188. ;---------------------------------------------------------------------
  189. ; Данные
  190. x_x db 13,10,'result= $'
  191. s_uword db 'unsigned word: $'
  192. s_sbyte db 'x= $'
  193. x1_x db 13,10,' |x; x<0$'
  194. x2_x db 'F(x)= |x/2; 0<=x<=3$'
  195. x3_x db ' |x-5; x>3$'
  196. s_sword db 'signed word : $'
  197. s_pak db 13,10,'Press any key...$'
  198. endline db 13,10,'$'
  199. buffer rb 7
  200. x dw 3
  201. f dw ?

Решение задачи: «Вычислите значение кусочной функции»

textual
Листинг программы
  1.         use16
  2.         org     100h
  3.  
  4.         ;деление, целая часть
  5.         mov     al,     [x]
  6.         cbw
  7.         mov     bl,     [y]
  8.         idiv    bl
  9.         call    ShowInt
  10.         or      ah,     ah
  11.         jz      .exit
  12.         ;если остаток есть - вывести десятичную точку
  13.         продолжить деление
  14.         mov     al,     ah
  15.         mov     si,     ax
  16.         mov     ah,     02h
  17.         mov     dl,     '.'
  18.         int     21h
  19.         mov     bh,     10
  20.         mov     cx,     [Len]
  21.         mov     ax,     si
  22.         .digit:
  23.                 mul     bh
  24.                 div     bl
  25.                 add     al,     '0'
  26.                 mov     dl,     al
  27.                 mov     al,     ah
  28.                 mov     si,     ax
  29.                 mov     ah,     02h
  30.                 int     21h
  31.                 mov     ax,     si
  32.                 or      al,     al
  33.         loopnz  .digit
  34.  
  35. .exit:
  36.         mov     ah,     09h
  37.         mov     dx,     msgPressAnyKey
  38.         int     21h
  39.         mov     ah,     10h     ;Задержка
  40.         int     16h             ;до нажатия клавиши
  41.  
  42.         int     20h             ;Завершение программы
  43.  
  44. ShowInt:
  45.         push    ax
  46.         push    bx
  47.         mov     bl,     10
  48.         or      al,     al
  49.         jns     .positive
  50.                 neg     al
  51.                 mov     ah,     02h
  52.                 mov     dl,     '-'
  53.                 int     21h
  54.         .positive:
  55.         xor     cx,     cx
  56.         .siDiv:
  57.                 mov     ah,     0
  58.                 div     bl
  59.                 mov     dl,     ah
  60.                 push    dx
  61.                 inc     cx
  62.                 or      al,     al
  63.         jnz     .siDiv
  64.         mov     ah,     02h
  65.         .show:
  66.                 pop     dx
  67.                 add     dl,     '0'
  68.                 int     21h
  69.         loop    .show
  70.         pop     bx
  71.         pop     ax
  72.         ret
  73. ;---------------------------------------------------------------
  74. ; Данные
  75. msgPressAnyKey  db      13, 10, 'Press any key to exit...', '$'
  76. x               db      123
  77. y               db      17
  78. Len             dw      4       ;количество знаков после запятой

Объяснение кода листинга программы

В данном коде на языке Assembler выполняется деление двух чисел с остатком и выводится десятичная точка в случае, если остаток есть. Затем происходит задержка до нажатия клавиши, после чего программа завершается. При выполнении кода на экран выводятся сообщения Press any key to exit... и 17 / 123 = 0,1404. Переменные: x - 123 (в формате double word); y - 17 (в формате double word); Len - 4 (в формате word).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы