Разделить со знаком попарно слова MS на байты MB - Assembler
Формулировка задачи:
Помогите пожалуйста
Не знаю как реализовать задание:
Даны два массива: массив слов MS и массив байтов MB. Разделить со знаком попарно слова MS на байты MB. Частные от деления поместить в младшие байты MS, а остатки - в старшие байты MS. Инвертировать те байты массива частных, в старших битах которых имеются 1. Найти сумму элементов массива остатков. Каков знак полученной суммы?
Решение задачи: «Разделить со знаком попарно слова MS на байты MB»
textual
Листинг программы
.MODEL SMALL .STACK 100h .DATA Data segment MS dw ?,?,?,?,?; MB db ?,?,?,?,?; sh1 db 80h; SUM db 0; end Data Code segment Start: xor bx,bx; mov si,bx; mov cx,5; Cike1: mov ax,MS[bx]; IDiv MB[si]; and AL,sh1; cmp AL,sh1 jz M1 M1:inv AL END M1 add SUM,AH mov MS[BX],ax inc bx inc bx inc si Loop Cike1 mov AL,sum cmp AL,0 jg M2 M2:mov ax,0FFFFh END M2 mov ax,0000h end Code END Start
Объяснение кода листинга программы
- .MODEL SMALL - устанавливает модель памяти для программы (в данном случае
SMALL
, что означаетмалый
размер программы) - .STACK 100h - указывает, что стек размером 100 байт будет использоваться в программе
- .DATA - сегмент данных, где хранятся переменные
- MS dw ?,?,?,?,? - пятиэлементная переменная типа
слово
(dw - double word), которая, предположительно, содержит словоMS
- MB db ?,?,?,?,? - пятиэлементная переменная типа
байты
(db - byte), которая, предположительно, содержит байтыMB
- sh1 db 80h - однобайтовая переменная, которая, предположительно, содержит символ
*
- SUM db 0 - однобайтовая переменная, которая, предположительно, используется для хранения суммы
- .CODE - сегмент кода, где хранятся процедуры и функции программы
- Start: - точка входа в программу
- xor bx,bx - инициализация регистра bx нулевым значением
- mov si,bx - копирование значения регистра bx в регистр si
- mov cx,5 - установка счетчика цикла на 5
- Cike1: - метка начала внутреннего цикла
- mov ax,MS[bx] - загрузка в регистр ax значения переменной MS, смещенного на значение регистра bx
- IDiv MB[si] - деление регистра ax на значение переменной MB, смещенное на значение регистра si
- and AL,sh1 - логическое И маскирующее битовое поле регистра al и значение переменной sh1
- cmp AL,sh1 - сравнение результата предыдущей операции со значением переменной sh1
- jz M1 - переход к метке M1, если результат сравнения равен 0
- inv AL - инвертирование значения регистра al
- END M1 - конец блока M1
- add SUM,AH - добавление значения регистра ah к значению переменной SUM
- mov MS[BX],ax - запись значения регистра ax в переменную MS, смещенную на значение регистра bx
- inc bx - увеличение значения регистра bx на 1
- inc bx - увеличение значения регистра bx на 1
- inc si - увеличение значения регистра si на 1
- Loop Cike1 - переход к метке Cike1
- mov AL,sum - загрузка значения переменной SUM в регистр al
- cmp AL,0 - сравнение значения регистра al с 0
- jg M2 - переход к метке M2, если результат сравнения больше 0
- mov ax,0FFFFh - установка значения регистра ax равным 0FFFFh (максимальное значение для 16-битного слова)
- mov ax,0000h - установка значения регистра ax равным 0000h (нулевое значение)
- END Start - конец программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д