сборка 8086 умножает четные элементы и сегмент данных

В качестве домашнего задания мне нужно инициализировать два одномерных массива, каждый из которых состоит из 10 членов по 2 байта, чтобы умножить каждый четный член на 2. Я нашел несколько кодов, но не понимаю части инициализации массивов в памяти.

В следующей части примера, после этого вопроса, что означает MOV AX,PODACI?

  • перемещает ли он только адрес первого члена в массиве TABELA и TABELA1 в AX
  • или он перемещает первый элемент в массиве TABELA и TABELA1 в AX (возможно ли это в моем случае, из-за размера AX у меня есть данные типа dw?)

Нужно ли определять только массивы в DATA SEGMENT, если адрес используется, как указано выше (мне нужно найти максимальный и минимальный элементы и в соответствии с этим планом определить также min_niz1 dw ? и max_niz1 dw ? в сегменте данных, возможно ли это, если я использую MOV AX,PODACI) ?

Что означают MOV SI, OFFSET TABELA и MOV DI, OFFSET TABELA1, будет ли это сдвигать адрес смещения в SI и DI и что будет позже в AL и BL?

:

PODACI  SEGMENT 'DATA'
  TABELA DB 3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 27h, 7Fh, 6Fh
  TABELA1 DB 3Fh, 05h, 5Bh, 04h, 03h, 6Dh, 7Dh, 27h, 01h, 6Fh     
PODACI  ENDS

PROGRAM SEGMENT 'CODE'
         ASSUME CS:PROGRAM,DS:PODACI
START:  MOV AX,PODACI
          MOV DS,AX
          MOV SI,0
          MOV DI, 0
          MOV CX, 10 
          MOV SI, OFFSET TABELA
          MOV DI, OFFSET TABELA1
petlja:   MOV AL, [SI]
          MOV BL, [DI] 
          CMP AL, BL
          JNZ nije
          INC DX  
nije:     INC SI
          INC DI
          loop petlja          


PROGRAM ENDS
END START

Во второй части мне нужно умножить четные члены в массивах на 2, возможно ли это с этой частью кода, которая ниже?

mov ax,niz1[di]
add ax,ax
mov niz1[di],ax

Я не знаю, правильный ли это способ использовать только четные члены массива и возвращать новое значение в мой массив? Я пытался выполнить это с помощью emu 8086, но решение для меня не очевидно.

even:
MOV DI, 0
mov ax,niz1[di]
add ax
mov niz1[di],ax
inc di
inc di
cmp di,11
jle even:

person nick_name    schedule 03.02.2018    source источник
comment
ваш второй цикл обнуляет индекс (di) внутри цикла, а не раньше. Кроме того, ваше условие цикла неверно: оно снова войдет в цикл с di=10, но ваш массив состоит всего из 5 элементов word, верно?   -  person Peter Cordes    schedule 04.02.2018
comment
Кроме того, shl niz1[di], 1 будет более эффективным, чем отдельная загрузка/сдвиг/сохранение.   -  person Peter Cordes    schedule 04.02.2018


Ответы (1)


Программа, которую вы изучали

В следующей части примера, после этого вопроса, что означает MOV AX,PODACI?

Пара инструкций

mov ax, PODACI
mov ds, ax

используется для настройки сегментного регистра DS так, чтобы он указывал на раздел DATA вашей программы.

Что это означает MOV SI, OFFSET TABELA и MOV DI, OFFSET TABELA1, будет ли это сдвигать адрес смещения в SI и DI и что будет позже в AL и BL?

MOV SI, OFFSET TABELA
MOV DI, OFFSET TABELA1

загрузит SI и DI со смещениями в оба массива, смещения в разделе DATA.

MOV AL, [SI]
MOV BL, [DI] 

загрузит AL и BL каждый с одним элементом размером в байт каждого массива.

Твое задание

Мне нужно инициализировать два одномерных массива, каждый с 10 терминами 2B, чтобы умножить каждый четный термин на 2

Чтобы инициализировать ваши новые массивы с 10 терминами 2B, вы должны использовать директиву DW:

niz1 dw 100,200,300,400,500,600,700,800,900,1000

Нижние индексы для всех элементов в этом массиве: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
Четные члены — это те элементы, которые имеют индексы массива. четные, поэтому элементы массива 0, 2, 4, 6, 8.
Поскольку каждый элемент массива занимает в памяти 2 байта, смещения, по которым вы найдете эти элементы, равны 0, 4, 8, 12, 16. Помните, что при программировании на ассемблере значение, которое появляется между квадратными скобками (niz1[di]), является смещением в памяти, а не индексом массива, как в языках программирования высокого уровня.

  xor di, di        ;Similar to "MOV DI,0".
Even:
  shl niz1[di], 1   ;Doubles this element.
  add di, 4         ;Goes to next 'even' term.
  cmp di, 20        ;Total size of the array.
  jb  Even          ;Repeat as long as we're IN the array.

Обратите внимание, что ваше решение для умножения четных членов в массивах с 2

mov ax,niz1[di]
add ax               !!! typo?
mov niz1[di],ax

хорошо, но удвоение через сдвиг влево лучше.

Удачи в превращении этого в рабочую программу.
(Каждой программе нужен выход в ОС, здесь DOS...)

person Fifoernik    schedule 10.02.2018