Вычислить количество элементов массива, лежащего в следующих диапазонах - Assembler
Формулировка задачи:
Вычислить количество элементов массива, лежащего в следующих диапазонах: n1=(0..10); n2=(11..20); n3=(21..255). Массив состоит из 10 целых чисел. Ассемблер в досбоксе.
вот что я написал:
cycle:
а как реализовать цикл?
model small .stack 100h .data len equ 10 arr1 db 25,9,3,45,5,15,7,87,95,17 res db 10 dup(?) .code start: mov ax,@data mov ds,ax mov cx,len xor si,si
Решение задачи: «Вычислить количество элементов массива, лежащего в следующих диапазонах»
textual
Листинг программы
_STACK segment para stack db 1024 dup(?) _STACK ends _DATA segment Range1lo dw 0 Range1hi dw 10 Range2lo dw 11 Range2hi dw 20 Range3lo dw 21 Range3hi dw 255 n1 dw ? n2 dw ? n3 dw ? N dw 10 Array dw 67,-39, 74,-13,-28, 50,-71,-84, 7, 20 MsgRange1 db 'In range 1: ', '$' MsgRange2 db 'In range 2: ', '$' MsgRange3 db 'In range 3: ', '$' CrLf db 0Dh, 0Ah, '$' _DATA ends _TEXT segment assume cs:_TEXT, ds:_DATA, ss:_STACK ;макрос для подсчёта количества элементов Count, ;входящих в диапазон [RangeLo, RangeHi] TestRange MACRO RangeLo, RangeHi, Count local Break cmp ax, RangeLo jl Break cmp ax, RangeHi jg Break inc Count Break: ENDM main proc ;инициализация сегментного регистра данных mov ax, _DATA mov ds, ax ;подсчёт количества элементов в поддиапазонах mov [n1], 0 mov [n2], 0 mov [n3], 0 cld lea si, [Array] mov cx, [N] @@ForI: lodsw TestRange Range1lo, Range1Hi, n1 TestRange Range2lo, Range2Hi, n2 TestRange Range3lo, Range3Hi, n3 loop @@ForI ;вывод результата ; - для диапазона 1 mov ah, 09h lea dx, [MsgRange1] int 21h mov ax, [n1] call ShowUInt mov ah, 09h lea dx, [CrLf] int 21h ; - для диапазона 2 mov ah, 09h lea dx, [MsgRange2] int 21h mov ax, [n2] call ShowUInt mov ah, 09h lea dx, [CrLf] int 21h ; - для диапазона 3 mov ah, 09h lea dx, [MsgRange3] int 21h mov ax, [n3] call ShowUInt mov ah, 09h lea dx, [CrLf] int 21h ;завершение программы mov ax, 4C00h int 21h main endp ShowUInt proc push ax push bx push dx mov bx, 0 @@While: aam push ax inc bx mov al, ah or al, al jnz @@While mov ah, 02h @@@While: pop dx add dl, '0' int 21h dec bx jnz @@@While pop dx pop bx pop ax ret ShowUInt endp _TEXT ends end main
Объяснение кода листинга программы
- Описание работы программы Программа на ассемблере подсчитывает количество элементов в трех диапазонах, используя макрос TestRange для подсчета элементов в каждом диапазоне. Диапазоны определены в сегменте данных, а массив находится в сегменте текста. Результаты выводятся на экран.
- Описание кода
- Сегмент _STACK используется для хранения стека вызовов функций. Он содержит стек, в котором последние 1024 элемента стека занимают 1024 байта памяти.
- Сегмент _DATA содержит переменные и массив. Диапазоны для подсчета определены в этом сегменте.
- Сегмент _TEXT используется для хранения кода программы. В этом сегменте определены функции, включая основную функцию main.
- В начале программы инициализируется сегментный регистр данных ds с сегментом _DATA.
- Затем происходит подсчет количества элементов в каждом диапазоне с помощью макроса TestRange. Для этого используется три переменные n1, n2 и n3, которые инициализируются нулями. Затем происходит цикл, в котором каждый элемент массива проверяется на принадлежность к каждому диапазону с помощью макроса TestRange. Если элемент принадлежит диапазону, соответствующее значение увеличивается на единицу.
- После подсчета количества элементов в каждом диапазоне результаты выводятся на экран с помощью функции ShowUInt. Для каждого диапазона выводится сообщение, указывающее количество элементов в этом диапазоне.
- В конце программы выводится сообщение, указывающее общее количество элементов в трех диапазонах.
- Таблица с номерами и описаниями переменных и процедур
- _STACK - сегмент стека вызовов функций.
- _DATA - сегмент данных.
- Range1lo, Range1hi, Range2lo, Range2hi, Range3lo, Range3hi - переменные, определяющие границы каждого диапазона.
- n1, n2, n3 - переменные, используемые для подсчета количества элементов в каждом диапазоне.
- N - переменная, содержащая общее количество элементов в массиве.
- Array - переменная, содержащая массив элементов.
- MsgRange1, MsgRange2, MsgRange3 - строки, содержащие сообщения, которые выводятся на экран.
- CrLf - строка, содержащая символы перевода строки.
- main - основная функция программы.
- ShowUInt - процедура, используемая для вывода целых чисел на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д