Вычислить количество элементов массива, лежащего в следующих диапазонах - Assembler

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

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

Вычислить количество элементов массива, лежащего в следующих диапазонах: n1=(0..10); n2=(11..20); n3=(21..255). Массив состоит из 10 целых чисел. Ассемблер в досбоксе. вот что я написал:
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
cycle: а как реализовать цикл?

Решение задачи: «Вычислить количество элементов массива, лежащего в следующих диапазонах»

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

Объяснение кода листинга программы

  1. Описание работы программы Программа на ассемблере подсчитывает количество элементов в трех диапазонах, используя макрос TestRange для подсчета элементов в каждом диапазоне. Диапазоны определены в сегменте данных, а массив находится в сегменте текста. Результаты выводятся на экран.
  2. Описание кода
    • Сегмент _STACK используется для хранения стека вызовов функций. Он содержит стек, в котором последние 1024 элемента стека занимают 1024 байта памяти.
    • Сегмент _DATA содержит переменные и массив. Диапазоны для подсчета определены в этом сегменте.
    • Сегмент _TEXT используется для хранения кода программы. В этом сегменте определены функции, включая основную функцию main.
    • В начале программы инициализируется сегментный регистр данных ds с сегментом _DATA.
    • Затем происходит подсчет количества элементов в каждом диапазоне с помощью макроса TestRange. Для этого используется три переменные n1, n2 и n3, которые инициализируются нулями. Затем происходит цикл, в котором каждый элемент массива проверяется на принадлежность к каждому диапазону с помощью макроса TestRange. Если элемент принадлежит диапазону, соответствующее значение увеличивается на единицу.
    • После подсчета количества элементов в каждом диапазоне результаты выводятся на экран с помощью функции ShowUInt. Для каждого диапазона выводится сообщение, указывающее количество элементов в этом диапазоне.
    • В конце программы выводится сообщение, указывающее общее количество элементов в трех диапазонах.
  3. Таблица с номерами и описаниями переменных и процедур
    • _STACK - сегмент стека вызовов функций.
    • _DATA - сегмент данных.
    • Range1lo, Range1hi, Range2lo, Range2hi, Range3lo, Range3hi - переменные, определяющие границы каждого диапазона.
    • n1, n2, n3 - переменные, используемые для подсчета количества элементов в каждом диапазоне.
    • N - переменная, содержащая общее количество элементов в массиве.
    • Array - переменная, содержащая массив элементов.
    • MsgRange1, MsgRange2, MsgRange3 - строки, содержащие сообщения, которые выводятся на экран.
    • CrLf - строка, содержащая символы перевода строки.
    • main - основная функция программы.
    • ShowUInt - процедура, используемая для вывода целых чисел на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.267 из 5
Похожие ответы