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. Может кто-нибудь объяснить причину это событие и как с ним бороться?
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
в целях тестирования).