Расположить данные в заданном адресе - Assembler

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

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

Здравствуйте! Есть задание:
Составить программу для определения суммы и числа четных элементов в массиве данных, содержащем 10 байт и расположенном начиная с адреса $00C0.
Я составил программу, которая находит сумму чётных элеметнов и их количесвто в массиве. Вот код программы:
data segment
    mas     db 12, 1, 3, 4, 7, 9, 11, 14, 15, 17        ; исходный массив
    len     dw $-mas                                    ; размер массива
    null_string db 13,10, '$'                           ; пробельная строка
data ends
 
code segment
    start:
        assume cs:code, ds:data
        
        mov ax, data
        mov ds, ax
        
        lea bx, mas     ; помещаем в bx адрес первого элемента массива
        mov cx, len     ; помещаем в cx размер массива, так как loop "идёт" по cx 
        xor ax, ax      ; обнуляем регистр
        xor dx, dx      ; обнуляем регистр
        push ax         ; сохраняем нулевую сумму
            
        for_:
            test ax, 01h    ; проверка на чётность
            
            jnz not_sum_and_count   ; если элемент массива не чётный, то сложение пропускается
            pop ax                  ; вытащить предыдущую сумму из стека
            add ax, [bx]            ; сложить предыдущую сумму с новым элементом
            push ax                 ; сохранить новую сумму
            inc dx                  ; увеличить счётчик чётных элементов на единицу
    
        not_sum_and_count:
            inc bx                  ; увеличить адрес массива на единицу <=> перейти к следующему элементу массива 
            mov ax, [bx]            ; занести в ax следуюший элемент массива
        loop for_                   ; проверить условие цикла: cx != нулю
        
        pop ax                      ; вытащить конечеую сумму
        call OutInt                 ; вывод суммы
        call OutNullString          ; вывод пробельной строки
            
        mov ax, dx                  ; поместить в ax количество чётных элементов
        call OutInt                 ; вывести количество чётных элементов
            
        mov ax, 4c00h               ; завершить программу
        int 21h

OutInt proc         ; процедура для вывода беззнакового десятичного числа
    push ax
    push dx
    
    aam
    add ax,3030h 
    mov dl,ah 
    mov dh,al 
    mov ah,02 
    int 21h 
    mov dl,dh 
    int 21h
    
    pop dx
    pop ax
    
    ret
OutInt endp 
    
OutNullString proc      ; процедура для вывода пробельной строки
    push ax
    push dx
 
    mov ah,9
    lea dx, null_string
    int 21h
    
    pop dx
    pop ax
    
    ret
OutNullString endp
    
code ends
end start
Программа работает правильно. Вопрос про память:

как расположить данные начиная с адреса памяти $00C0?

Решение задачи: «Расположить данные в заданном адресе»

textual
Листинг программы
times 00C0 db 0

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

В данном коде используется язык Assembler. Ниже представлен список действий, которые выполняются в коде:

  1. times - это команда, которая выполняет повторение указанного действия определенное количество раз.
  2. 00C0 - это адрес, куда необходимо поместить данные.
  3. db - это команда, которая помещает данные в память по указанному адресу.
  4. 0 - это значение, которое помещается в память по указанному адресу. Таким образом, в данном коде происходит следующее:
    • Команда times выполняет повторение действия db 0 раз.
    • Значение 0 помещается в память по адресу 00C0.

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

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