Перенос данных из одного места памяти в другое в 8086

Вопрос в том:

Напишите программу на ассемблере для перемещения 16 байтов данных, начиная со смещения 0200H до 0300H в сегменте 7000H.

Как написать программу? Я имею в виду, как я должен взять адрес? Должен ли я учитывать адрес смещения или базовый адрес?


person Susan    schedule 20.06.2017    source источник
comment
Они дают вам сегмент (базу) и смещение. Исходя из этого, вы можете легко вычислить абсолютный адрес. Но вам это даже не нужно, потому что 8086 использует адресацию со смещением сегментов, поэтому они дают вам все значения, которые вам нужно вставить. Это довольно простое упражнение, если вы понимаете, что такое регистры сегментов, и знакомы с их назначением. строковые инструкции (в частности, MOVSB).   -  person Cody Gray    schedule 20.06.2017


Ответы (1)


Как написать программу?

Вы пишете цикл, который последовательно читает с исходных адресов и записывает по адресам назначения.

Я имею в виду, как мне взять адрес?
Должен ли я считать адрес смещения или базовый адрес?

Для адресации памяти вам необходимо использовать оба компонента адреса.

  • Вы помещаете данное значение сегмента в регистр сегмента. DS - более обычный выбор:

    mov     ax, 7000h
    mov     ds, ax
    
  • Вы помещаете предоставленное исходное смещение в адресный регистр, такой как BX, SI или DI:

    mov     si, 0200h
    
  • Вы помещаете предоставленное смещение пункта назначения в другой адресный регистр:

    mov     di, 0300h
    
  • Вы помещаете запрошенное количество байтов в один из оставшихся регистров общего назначения, CX является естественным выбором и действительно единственным выбором, если мы хотим использовать инструкцию LOOP:

    mov     cx, 16
    

Все вышеперечисленные варианты приводят к следующему циклу:

Again:
    mov     al, [si]   ;Get 1 byte from the source range
    inc     si         ;Point to the next byte
    mov     [di], al   ;Write 1 byte in the destination range
    inc     di         ;Point to the next byte
    loop    Again      ;Decrement the counter and jump to the label "Again"
                       ; if the counter is not yet exhausted.

Это лишь одно из решений вашей задачи. Существует гораздо больше.
Самое короткое решение, однако, использует специальную инструкцию, такую ​​как MOVS. Найдите его в своем учебнике и посмотрите, что требуется, чтобы начать его использовать. Удачного открытия!

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

person Sep Roland    schedule 25.06.2017