Действия над массивами слов и массивами байтов - Assembler
Формулировка задачи:
Есть задание:
Даны два массива: массив слов MS и массив байтов MB. Установить "1" в 4-ых и 6-тых битах всех элементов массива MB. Коды отрицательных слов MS сдвинуть логически вправо. Разделить со знаком нечетные элементы массива слов на четные элементы массива байтов. Образовать дополнительные массивы частных и остатков деления. Определить сумму элементов массива частных и ее знак. Превышают ли остатки от деления число 10?
Накинул только вот такое начало программы. Дальше, не знаю, что да как делать.
Прошу помочь информацией, ссылками, примерами кода. Буду очень благодарен!
Листинг программы
- .model small
- .stack 100h
- .data
- MB db 1, 2, 40, 122, 133, 245, 144, 111, 55 ; массив байтов
- MS dw 55, 111, 144, -245, 133, 122, -40, 2, 1 ; массив слов
- MsgOverflow db 'Overflow', 0Dh, 0Ah, '$'
- MsgNothing db 'Find Nothing', 0Dh, 0Ah, '$'
- .code
- main:
- ; Действия
- @@Exit:
- mov ax, 4C00h ; выход в DOS
- int 21h
- end main
Решение задачи: «Действия над массивами слов и массивами байтов»
textual
Листинг программы
- LOCALS
- .model small
- .stack 100h
- .data
- Len equ 9 ;длина массивов
- MB db 1, 2, 40, 122, 133, 245, 144, 111, 55 ; массив байтов
- MS dw 55, 111, 144, -245, 133, 122, -40, 2, 1 ; массив слов
- MC dw Len/2 dup(?) ; массив частных
- MO dw Len/2 dup(?) ; массив остатков
- Sum db 0 ; сумма частных
- Positive db 'Positive', 0Dh, 0Ah, '$'
- Negative db 'Negative', 0Dh, 0Ah, '$'
- Prevyshaut db 'Greater', 0Dh, 0Ah, '$'
- NePrevyshaut db 'Not greater', 0Dh, 0Ah, '$'
- .code
- main proc
- mov ax, @data
- mov ds, ax
- ;Установить "1" в 4-ых и 6-тых битах всех элементов массива MB.
- lea si, MB ;si - указатель на массив MB
- mov cx, Len ;длина массива MB
- @@For1:
- or [si], byte ptr 01010000b ;установить 4 и 6 биты
- add si, 1 ;увеличение на размер одного элемента массива
- loop @@For1
- ;Коды отрицательных слов MS сдвинуть логически вправо.
- lea si, MS ;si - указатель на массив MS
- mov cx, Len ;длина массива MS
- @@For2:
- mov ax, [si]
- or ax, ax
- jns @@Next2
- shr ax, 1 ;Коды отрицательных слов MS
- mov [si], ax ;сдвинуть логически вправо.
- @@Next2:
- add si, 2 ;увеличение на размер одного элемента массива
- loop @@For2
- ;Разделить со знаком нечетные элементы массива слов на четные элементы массива байтов.
- ;Образовать дополнительные массивы частных и остатков деления.
- lea si, MS ; si - указатель на массив MS
- lea di, MB ; di - указатель на массив MB
- mov bx, 0 ; bx - индекс в массивах остатков и частных
- add di, 1 ; di - на чётный индекс элемента массива
- mov cx, Len/2 ; Длина массивов
- @@For3:
- push bx
- mov al, [di]
- cbw
- mov bx, ax
- mov ax, [si]
- cwd
- add si, 4 ; увеличиваем на размер двух элементов массива MS
- add di, 2 ; увеличиваем на размер двух элементов массива MB
- idiv bx ; Производим знаковое деление (dx:ax) на bx
- pop bx
- mov MC[bx], ax
- mov MO[bx], dx
- add bx, 1 ;увеличение на размер одного элемента массива MO или MC
- loop @@For3
- ;Определить сумму элементов массива частных и ее знак.
- mov al, 0 ;сумма элементов массива
- mov cx, Len/2 ; Длина массива
- lea si, MC
- @@For4:
- add al, [si]
- add si, 1 ;увеличение на размер одного элемента массива MC
- loop @@For4
- mov Sum, al
- or al, al
- js @@Negative
- mov ah, 09h
- lea dx, Positive
- int 21h
- jmp @@End5
- @@Negative:
- mov ah, 09h
- lea dx, Negative
- int 21h
- @@End5:
- ;Превышают ли остатки от деления число 10?
- lea si, MO
- mov cx, Len/2
- @@For5:
- cmp [si], word ptr 10
- jg @@Greater
- loop @@For5
- mov ah, 09h
- lea dx, NePrevyshaut
- int 21h
- jmp @@Exit
- @@Greater:
- mov ah, 09h
- lea dx, Prevyshaut
- int 21h
- @@Exit:
- mov ax, 4C00h
- int 21h
- main endp
- end main
Объяснение кода листинга программы
- Инициализируются переменные:
Len
со значением 9 (длина массивов)MB
с массивом байтов: 1, 2, 40, 122, 133, 245, 144, 111, 55MS
с массивом слов: 55, 111, 144, -245, 133, 122, -40, 2, 1MC
с пустым массивом размера Len/2 для частныхMO
с пустым массивом размера Len/2 для остатковSum
с байтом 0 для хранения суммы частныхPositive
с текстом 'Positive', 0Dh, 0Ah, '$'Negative
с текстом 'Negative', 0Dh, 0Ah, '$'Prevyshaut
с текстом 'Greater', 0Dh, 0Ah, '$'NePrevyshaut
с текстом 'Not greater', 0Dh, 0Ah, '$'
- В процедуре
main
выполняются следующие действия:- Устанавливается сегмент данных
- Устанавливается
1
в 4-ых и 6-тых битах всех элементов массива MB - Коды отрицательных слов MS сдвигаются логически вправо
- Нечетные слова массива MS делятся с остатком на четные байты массива MB, формируются дополнительные массивы частных и остатков
- Определяется сумма элементов массива частных и их знак
- Проверяется, превышают ли остатки от деления число 10
- Программа завершается
- Программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д