[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
- Следующий код, который не относится к данному списку, должен быть помещен после этой строки