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