8086, копирование данных из одного списка в другой

;program starts

TABLE  DB 0, 2, 0, 2, 0, 0, 4, 0, 0, 1, 0, 0, 3, 0, 1, 0   
TABLE1 DB ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?   

MOV SI, OFFSET TABLE  
MOV DI, OFFSET TABLE1

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

MOV AL, [SI+1]
MOV [DI+4], AL

MOV AL, [SI+2]
MOV [DI+8], AL

MOV AL, [SI+3]
MOV [DI+12], AL

MOV AL, [SI+4]
MOV [DI+1], AL

;program ends

Вот простой код, который копирует данные из TABLE в TABLE1. Когда я запускаю эту программу в emu8086, значение [SI] отображается в регистре AL (MOV AL, [SI]). Таким образом, значения в «TABLE» отображаются в регистре AL и логически должны быть одинаковыми. Но когда выполняется строка «MOV AL, [SI+1]», регистр AL показывает 4 вместо 2. Если я заменю этот второй элемент на 3, регистр Al покажет 6 вместо 3. Кто-нибудь может объяснить причину это событие и как ему противостоять?


person protonmail    schedule 14.11.2016    source источник
comment
Каково значение DS? Установлен ли он для сегмента, в котором расположены массивы? Работает ли программа, если добавить ORG 100h в начале файла?   -  person Michael    schedule 14.11.2016
comment
;program starts в таблицу данных? Это, вероятно, приведет к какому-то странному поведению.   -  person Ped7g    schedule 14.11.2016


Ответы (1)


Ассемблерные программы для EMU требуют некоторой структуры, которой нет в вашем коде:

.model small                 ◄■■■ PROGRAM SIZE.
.stack 100h                  ◄■■■ STACK SEGMENT DECLARATION.
.data                        ◄■■■ DATA SEGMENT DECLARATION.

TABLE  DB 1, 2, 3, 4, 5, 0, 4, 0, 0, 1, 0, 0, 3, 0, 1, 0   
TABLE1 DB ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?   

.code                        ◄■■■ CODE SEGMENT DECLARATION.

mov ax, @data                ◄■■■ INITIALIZATION
mov ds, ax                   ◄■■■ OF DATA SEGMENT.

MOV SI, OFFSET TABLE  
MOV DI, OFFSET TABLE1

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

MOV AL, [SI+1]
MOV [DI+4], AL

MOV AL, [SI+2]
MOV [DI+8], AL

MOV AL, [SI+3]
MOV [DI+12], AL

MOV AL, [SI+4]
MOV [DI+1], AL

mov ax, 4c00h                ◄■■■ FINISH PROGRAM PROPERLY.
int 21h

С этой структурой ваш код работает (я заменил некоторые значения TABLE для тестирования).

person Jose Manuel Abarca Rodríguez    schedule 14.11.2016
comment
@protonmail, если этот ответ полезен, вы можете нажать на галочку, чтобы принять его (так вы вознаграждаете усилия людей). - person Jose Manuel Abarca Rodríguez; 15.11.2016