[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
- Следующий код, который не относится к данному списку, должен быть помещен после этой строки
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д