Написал вот так
DataSG SEGMENT
A DW 1; коэффициенты
B DW 3
C DW 2
Xmin DW 3
Xmax DW 7
X DW 5 DUP (?),'$'
Y DW 5 DUP (?),'$'
DataSG ENDS

STACKSG SEGMENT PARA 'Stack'
DB 50 DUP (?)
STACKSG ENDS

CodeSG SEGMENT
ASSUME SS:STACKSG,CS:CODESG,DSATASG
Start:
MOV AX,DATASG ; загрузка номера сегмента
MOV DS,AX ; в регистр DS
XOR AX,AX ; обнуление AX

;Циклическое вычисление заданного выражения
MOV CX, XMIN ; задание начального состояния переменной цикла
MOV SI,0 ; индекс первого элемента в SI
Calculate:
MOV AX,CX ; AX=Xmin
MOV X[SI],AX ; X[0]=Xmin
MUL X[SI] ; AX=X^2
MUL A ; AX=A*X^2
MOV BX,AX ; BX=A*X^2
MOV AX,B ; AX=B
MUL X[SI] ; AX=B*X
ADD AX,BX ; AX=A*X^2+B*X
ADD AX, C ; AX=A*X^2+B*X+C
MOV Y[SI], AX ; Y[SI]=A*X^2+B*X+C
ADD SI,2 ; переходим к следующему элементу массива
; 2 прибавляем, так массивы состоят из слов
; и 1 слово = 2 байта
ADD CX,1 ; увеличиваем значение X на 1
CMP CX, XMAX ; сравнение переменной цикла с граничным значением
JNE Calculate ; переход к началу фрагмента, выполняемого в цикле
Смотрю под отладчиком и получаю бред. После ADD SI,2 верные значения X и Y превращаются в неверные и перемещаются в конец массива. Где я ошибся?