Действия над массивами слов и массивами байтов - Assembler

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

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

Есть задание: Даны два массива: массив слов MS и массив байтов MB. Установить "1" в 4-ых и 6-тых битах всех элементов массива MB. Коды отрицательных слов MS сдвинуть логически вправо. Разделить со знаком нечетные элементы массива слов на четные элементы массива байтов. Образовать дополнительные массивы частных и остатков деления. Определить сумму элементов массива частных и ее знак. Превышают ли остатки от деления число 10? Накинул только вот такое начало программы. Дальше, не знаю, что да как делать. Прошу помочь информацией, ссылками, примерами кода. Буду очень благодарен!
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. MB db 1, 2, 40, 122, 133, 245, 144, 111, 55 ; массив байтов
  5. MS dw 55, 111, 144, -245, 133, 122, -40, 2, 1 ; массив слов
  6.  
  7. MsgOverflow db 'Overflow', 0Dh, 0Ah, '$'
  8. MsgNothing db 'Find Nothing', 0Dh, 0Ah, '$'
  9. .code
  10. main:
  11. ; Действия
  12.  
  13. @@Exit:
  14. mov ax, 4C00h ; выход в DOS
  15. int 21h
  16. end main

Решение задачи: «Действия над массивами слов и массивами байтов»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.  
  9.     Len     equ     9                                           ;длина массивов
  10.     MB      db      1, 2, 40, 122, 133, 245, 144, 111, 55       ; массив байтов
  11.     MS      dw      55, 111, 144, -245, 133, 122, -40, 2, 1     ; массив слов
  12.  
  13.     MC      dw      Len/2 dup(?)                                ; массив частных
  14.     MO      dw      Len/2 dup(?)                                ; массив остатков
  15.  
  16.     Sum     db      0                                           ; сумма частных
  17.  
  18.     Positive            db      'Positive', 0Dh, 0Ah, '$'
  19.     Negative            db      'Negative', 0Dh, 0Ah, '$'
  20.     Prevyshaut          db      'Greater', 0Dh, 0Ah, '$'
  21.     NePrevyshaut        db      'Not greater', 0Dh, 0Ah, '$'
  22. .code
  23.  
  24. main    proc
  25.         mov     ax,     @data
  26.         mov     ds,     ax
  27.  
  28.         ;Установить "1" в 4-ых и 6-тых битах всех элементов массива MB.
  29.         lea     si,     MB  ;si - указатель на массив MB
  30.         mov     cx,     Len ;длина массива MB
  31. @@For1:
  32.         or  [si],       byte ptr 01010000b  ;установить 4 и 6 биты
  33.         add     si,     1   ;увеличение на размер одного элемента массива
  34.         loop    @@For1
  35.  
  36.         ;Коды отрицательных слов MS сдвинуть логически вправо.
  37.         lea     si,     MS  ;si - указатель на массив MS
  38.         mov     cx,     Len ;длина массива MS
  39. @@For2:
  40.         mov     ax,     [si]
  41.         or      ax,     ax
  42.         jns     @@Next2
  43.         shr     ax,     1   ;Коды отрицательных слов MS
  44.         mov     [si],   ax  ;сдвинуть логически вправо.
  45. @@Next2:
  46.         add     si,     2   ;увеличение на размер одного элемента массива
  47.         loop    @@For2
  48.  
  49.         ;Разделить со знаком нечетные элементы массива слов на четные элементы массива байтов.
  50.         ;Образовать дополнительные массивы частных и остатков деления.
  51.         lea     si,     MS  ; si - указатель на массив MS
  52.         lea     di,     MB  ; di - указатель на массив MB
  53.         mov     bx,     0   ; bx - индекс в массивах остатков и частных
  54.         add     di,     1   ; di - на чётный индекс элемента массива
  55.         mov     cx,     Len/2 ; Длина массивов
  56. @@For3:
  57.         push    bx
  58.         mov     al,     [di]
  59.         cbw
  60.         mov     bx,     ax
  61.         mov     ax,     [si]
  62.         cwd
  63.         add     si,     4   ; увеличиваем на размер двух элементов массива MS
  64.         add     di,     2   ; увеличиваем на размер двух элементов массива MB
  65.  
  66.         idiv    bx          ; Производим знаковое деление (dx:ax) на bx
  67.         pop     bx
  68.         mov     MC[bx], ax
  69.         mov     MO[bx], dx
  70.         add     bx,     1   ;увеличение на размер одного элемента массива MO или MC
  71.         loop    @@For3
  72.  
  73.         ;Определить сумму элементов массива частных и ее знак.
  74.         mov     al,     0   ;сумма элементов массива
  75.         mov     cx,     Len/2 ; Длина массива
  76.         lea     si,     MC
  77. @@For4:
  78.         add     al,     [si]
  79.         add     si,     1   ;увеличение на размер одного элемента массива MC
  80.         loop    @@For4
  81.         mov     Sum,    al
  82.         or      al,     al
  83.         js      @@Negative
  84.         mov     ah,     09h
  85.         lea     dx,     Positive
  86.         int     21h
  87.         jmp     @@End5
  88. @@Negative:
  89.         mov     ah,     09h
  90.         lea     dx,     Negative
  91.         int     21h
  92. @@End5:
  93.  
  94.         ;Превышают ли остатки от деления число 10?
  95.         lea     si,     MO
  96.         mov     cx,     Len/2
  97. @@For5:
  98.         cmp     [si],   word ptr 10
  99.         jg      @@Greater
  100.         loop    @@For5
  101.         mov     ah,     09h
  102.         lea     dx,     NePrevyshaut
  103.         int     21h
  104.         jmp     @@Exit
  105.  
  106. @@Greater:
  107.         mov     ah,     09h
  108.         lea     dx,     Prevyshaut
  109.         int     21h
  110.  
  111. @@Exit:
  112.         mov     ax,     4C00h
  113.         int     21h
  114. main    endp
  115.  
  116. end     main

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

  1. Инициализируются переменные:
    • Len со значением 9 (длина массивов)
    • MB с массивом байтов: 1, 2, 40, 122, 133, 245, 144, 111, 55
    • MS с массивом слов: 55, 111, 144, -245, 133, 122, -40, 2, 1
    • MC с пустым массивом размера Len/2 для частных
    • MO с пустым массивом размера Len/2 для остатков
    • Sum с байтом 0 для хранения суммы частных
    • Positive с текстом 'Positive', 0Dh, 0Ah, '$'
    • Negative с текстом 'Negative', 0Dh, 0Ah, '$'
    • Prevyshaut с текстом 'Greater', 0Dh, 0Ah, '$'
    • NePrevyshaut с текстом 'Not greater', 0Dh, 0Ah, '$'
  2. В процедуре main выполняются следующие действия:
    • Устанавливается сегмент данных
    • Устанавливается 1 в 4-ых и 6-тых битах всех элементов массива MB
    • Коды отрицательных слов MS сдвигаются логически вправо
    • Нечетные слова массива MS делятся с остатком на четные байты массива MB, формируются дополнительные массивы частных и остатков
    • Определяется сумма элементов массива частных и их знак
    • Проверяется, превышают ли остатки от деления число 10
    • Программа завершается
  3. Программа завершается.

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


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

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

5   голосов , оценка 3.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы