[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 ---------------------------------------------
Объяснение кода листинга программы
- Объявляем макрос вывода сообщений с одним параметром
msg
- Задаем регистры для работы макроса: ah=9, dx=msg
- Вызываем функцию вывода сообщения с помощью int 21h
- Завершаем описание макроса ENDM
- Объявляем макрос поиска 10% от первого элемента массива без параметров
- Задаем регистры для работы макроса: ax=value of the first array element, bx=10
- Выполняем деление ax на bx с использованием регистра dx и получаем результат в ax
- Увеличиваем значение ah на 8 сдвигов вправо для получения значения в формате с плавающей точкой
- Завершаем описание макроса ENDM
- Определяем сегмент данных с переменными num и string
- Задаем начальный адрес для сегмента данных в регистре ax
- Передаем этот адрес в качестве параметра для макроса MESSAGE
- Вызываем макрос FIND10
- Следующий код, который не относится к данному списку, должен быть помещен после этой строки
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д