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

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

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

Люди добрые, помогите переделать эту программу через макросы, я их вообще не понимаю. Программа находит 10% от первого числа и ищет какие остальные числа вошли в этот диапазон. Tasm
data segment
    num     db  120, 240, 35, 119, 232, 9, 60, 33, 243, 197, 124, 3, 41, 202, 111, 100
    string  db "Numbers lying in the limit of 10% by first number: $"
    
data ends
 
text segment
assume CS:text, DS:data, SS:stk
begin:
    mov ax,data
    mov ds,ax
    mov es,ax
 
    xor ah, ah
    mov al, [num]
    mov bl, 10
    div bl
    shr al, 1 
    mov bl, [num]
    mov bh, bl
    sub bl, al
    add bh, al
jnc no_overflow
    mov bh, 255
no_overflow:
    
    mov cx, 15
    mov si, offset num
main_loop:
    xor ah, ah
    mov al,[si]
    cmp al, bl
    jl skip  
            cmp al, bh
    jg skip  
        
        push bx
        push cx
        
        xor bx, bx
        mov cx, 10
    separation_loop:
        xor dx, dx
        div cx
        or dl, 30h
        push dx
        inc bl
        cmp ax, 0
    jne separation_loop  
        
        mov cx, bx
        mov ah, 02h
    output_loop:
        pop dx
        int 21h
    loop output_loop
    
        mov dl, 0ah
        int 21h
        mov dl, 0dh
        int 21h
        
        pop cx
        pop bx
 
skip:
    inc si
loop main_loop
 
    mov ah,4ch  
    int 21h

text ends
 
stk segment stack
db 256 dup(0)
stk ends
 
end begin

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

textual
Листинг программы
;------- Описываем макросы ------------------------------
; Макрос вывода сообщений. Имеет параметр "msg",
; в который нужно (при вызове) подставить адрес строки
MESSAGE  MACRO  msg           ;
         mov   ah,9           ;
         lea   dx,msg         ;
         int   21h            ;
         ENDM                 ;
 
; Макрос поиска 10% от первого элемента массива. Параметров - нет:
FIND10   MACRO                ;
         xor   ax,ax          ;
         mov   al,[num]       ; АХ = значение элемента(1)
         mov   bx,10          ; делитель
         xor   dx,dx          ;
         div   bx             ;
         shl   ah,8           ; AX = результат
         ENDM                 ;
;===========================================================================
data segment
    num     db  120, 240, 35, 119, 232, 9, 60, 33, 243, 197, 124, 3, 41, 202, 111, 100
    string  db "Numbers lying in the limit of 10% by first number: $"
    
data ends
 
text segment
assume CS:text, DS:data, SS:stk
begin:
    mov   ax,data             ;
    mov   ds,ax               ;
    mov   es,ax               ;
 
    MESSAGE  string           ; зовём макрос, передав ему адрес строки
    FIND10                    ; ищем 10% от первого элемента
    ;..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