Разделить со знаком попарно слова 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

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

  1. .MODEL SMALL - устанавливает модель памяти для программы (в данном случае SMALL, что означает малый размер программы)
  2. .STACK 100h - указывает, что стек размером 100 байт будет использоваться в программе
  3. .DATA - сегмент данных, где хранятся переменные
  4. MS dw ?,?,?,?,? - пятиэлементная переменная типа слово (dw - double word), которая, предположительно, содержит слово MS
  5. MB db ?,?,?,?,? - пятиэлементная переменная типа байты (db - byte), которая, предположительно, содержит байты MB
  6. sh1 db 80h - однобайтовая переменная, которая, предположительно, содержит символ *
  7. SUM db 0 - однобайтовая переменная, которая, предположительно, используется для хранения суммы
  8. .CODE - сегмент кода, где хранятся процедуры и функции программы
  9. Start: - точка входа в программу
  10. xor bx,bx - инициализация регистра bx нулевым значением
  11. mov si,bx - копирование значения регистра bx в регистр si
  12. mov cx,5 - установка счетчика цикла на 5
  13. Cike1: - метка начала внутреннего цикла
  14. mov ax,MS[bx] - загрузка в регистр ax значения переменной MS, смещенного на значение регистра bx
  15. IDiv MB[si] - деление регистра ax на значение переменной MB, смещенное на значение регистра si
  16. and AL,sh1 - логическое И маскирующее битовое поле регистра al и значение переменной sh1
  17. cmp AL,sh1 - сравнение результата предыдущей операции со значением переменной sh1
  18. jz M1 - переход к метке M1, если результат сравнения равен 0
  19. inv AL - инвертирование значения регистра al
  20. END M1 - конец блока M1
  21. add SUM,AH - добавление значения регистра ah к значению переменной SUM
  22. mov MS[BX],ax - запись значения регистра ax в переменную MS, смещенную на значение регистра bx
  23. inc bx - увеличение значения регистра bx на 1
  24. inc bx - увеличение значения регистра bx на 1
  25. inc si - увеличение значения регистра si на 1
  26. Loop Cike1 - переход к метке Cike1
  27. mov AL,sum - загрузка значения переменной SUM в регистр al
  28. cmp AL,0 - сравнение значения регистра al с 0
  29. jg M2 - переход к метке M2, если результат сравнения больше 0
  30. mov ax,0FFFFh - установка значения регистра ax равным 0FFFFh (максимальное значение для 16-битного слова)
  31. mov ax,0000h - установка значения регистра ax равным 0000h (нулевое значение)
  32. END Start - конец программы

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


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

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

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