[TASM] Переписать программу, используя макросы - Assembler

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

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

Люди добрые, помогите переделать эту программу через макросы, я их вообще не понимаю. Программа находит 10% от первого числа и ищет какие остальные числа вошли в этот диапазон. Tasm
Листинг программы
  1. data segment
  2. num db 120, 240, 35, 119, 232, 9, 60, 33, 243, 197, 124, 3, 41, 202, 111, 100
  3. string db "Numbers lying in the limit of 10% by first number: $"
  4. data ends
  5. text segment
  6. assume CS:text, DS:data, SS:stk
  7. begin:
  8. mov ax,data
  9. mov ds,ax
  10. mov es,ax
  11. xor ah, ah
  12. mov al, [num]
  13. mov bl, 10
  14. div bl
  15. shr al, 1
  16. mov bl, [num]
  17. mov bh, bl
  18. sub bl, al
  19. add bh, al
  20. jnc no_overflow
  21. mov bh, 255
  22. no_overflow:
  23. mov cx, 15
  24. mov si, offset num
  25. main_loop:
  26. xor ah, ah
  27. mov al,[si]
  28. cmp al, bl
  29. jl skip
  30. cmp al, bh
  31. jg skip
  32. push bx
  33. push cx
  34. xor bx, bx
  35. mov cx, 10
  36. separation_loop:
  37. xor dx, dx
  38. div cx
  39. or dl, 30h
  40. push dx
  41. inc bl
  42. cmp ax, 0
  43. jne separation_loop
  44. mov cx, bx
  45. mov ah, 02h
  46. output_loop:
  47. pop dx
  48. int 21h
  49. loop output_loop
  50. mov dl, 0ah
  51. int 21h
  52. mov dl, 0dh
  53. int 21h
  54. pop cx
  55. pop bx
  56. skip:
  57. inc si
  58. loop main_loop
  59. mov ah,4ch
  60. int 21h
  61.  
  62. text ends
  63. stk segment stack
  64. db 256 dup(0)
  65. stk ends
  66. end begin

Решение задачи: «[TASM] Переписать программу, используя макросы»

textual
Листинг программы
  1. ;------- Описываем макросы ------------------------------
  2. ; Макрос вывода сообщений. Имеет параметр "msg",
  3. ; в который нужно (при вызове) подставить адрес строки
  4. MESSAGE  MACRO  msg           ;
  5.          mov   ah,9           ;
  6.          lea   dx,msg         ;
  7.          int   21h            ;
  8.          ENDM                 ;
  9.  
  10. ; Макрос поиска 10% от первого элемента массива. Параметров - нет:
  11. FIND10   MACRO                ;
  12.          xor   ax,ax          ;
  13.          mov   al,[num]       ; АХ = значение элемента(1)
  14.          mov   bx,10          ; делитель
  15.          xor   dx,dx          ;
  16.          div   bx             ;
  17.          shl   ah,8           ; AX = результат
  18.          ENDM                 ;
  19. ;===========================================================================
  20. data segment
  21.     num     db  120, 240, 35, 119, 232, 9, 60, 33, 243, 197, 124, 3, 41, 202, 111, 100
  22.     string  db "Numbers lying in the limit of 10% by first number: $"
  23.    
  24. data ends
  25.  
  26. text segment
  27. assume CS:text, DS:data, SS:stk
  28. begin:
  29.     mov   ax,data             ;
  30.     mov   ds,ax               ;
  31.     mov   es,ax               ;
  32.  
  33.     MESSAGE  string           ; зовём макрос, передав ему адрес строки
  34.     FIND10                    ; ищем 10% от первого элемента
  35.     ;..next code ---------------------------------------------

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

  1. Объявляем макрос вывода сообщений с одним параметром msg
  2. Задаем регистры для работы макроса: ah=9, dx=msg
  3. Вызываем функцию вывода сообщения с помощью int 21h
  4. Завершаем описание макроса ENDM
  5. Объявляем макрос поиска 10% от первого элемента массива без параметров
  6. Задаем регистры для работы макроса: ax=value of the first array element, bx=10
  7. Выполняем деление ax на bx с использованием регистра dx и получаем результат в ax
  8. Увеличиваем значение ah на 8 сдвигов вправо для получения значения в формате с плавающей точкой
  9. Завершаем описание макроса ENDM
  10. Определяем сегмент данных с переменными num и string
  11. Задаем начальный адрес для сегмента данных в регистре ax
  12. Передаем этот адрес в качестве параметра для макроса MESSAGE
  13. Вызываем макрос FIND10
  14. Следующий код, который не относится к данному списку, должен быть помещен после этой строки

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


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

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

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

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

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

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