@LoranDeMarcus

Как поменять индекс массива в ассемблере?

Добрый день, прошу помощи в программе.
Как в программе сделать, чтобы первое слагаемое ссылалось на X[i-1] вместо X[i] в формуле Y[i]=A*X[i-1] + B*X[i]
Сейчас в программе просто X[i]
SDATA SEGMENT WORD PUBLIC 'DATA'
A	DB -5								;- это два коэффициента
B	DB 17
ARRAY_X     DB -1,22,-34,12,-51, 68		; - массив чисел X
ARRAY_Y     DW 6  DUP(0)         		; - массив чисел Y
SDATA ENDS

SSTACK SEGMENT PARA STACK 'STACK'
DW 64 DUP (?)
STACK_POINT LABEL WORD
SSTACK ENDS

SCODE SEGMENT WORD PUBLIC 'CODE'
ASSUME CS:SCODE,DS:SDATA,SS:SSTACK

START:  MOV AX,SDATA					; Запись сегментного адреса
MOV DS,AX								; Данных в регистр DS
MOV AX,SSTACK							; Определение сегмента стека
MOV SS,AX								; и указателя стека
MOV SP,OFFSET STACK_POINT
										; Инициализация исходных данных
MOV SI,0								; SI содержит индекс массива X
MOV DI,0								; DI содержит индекс массива Y
MOV CX,6								; СX:= число элементов массива X
M1:MOV AL, A							; AL:= коэффициент A
CBW										; Расширение байта до слова
MOV BX, AX								; Сохранение коэффициента в BX									
MOV AL, ARRAY_X[SI] 					; Занесение очередного элемента массива X в аккумулятор
IMUL BX									; AX:=A*X[I]
push AX									; Помещение АХ в стек
										
MOV AL, B								; AL:= коэффициент B
CBW 									; Расширение байта до слова
MOV BX, AX								; Сохранение коэффициента в BX
MOV AL, ARRAY_X[SI]						; Занесение очередного элемента массива X в аккумулятор
IMUL BX									; AX:=B*X[I]
POP BX									; Извлечение A*X[I] из стека
ADD AX,BX								; Y[I]=:A*X[I]+B*X[I]

MOV ARRAY_Y[DI], AX						; запись в массив Y
INC DI									; увеличение DI на 1
INC DI									; увеличение DI на 1
INC SI									; увеличение SI на 1
LOOP M1									; переход на метку M1

MOV AX,4C00H							; выход из программы
INT 21H									; выполняется функция DOS, номер
SCODE   ENDS							; конец кодового сегмента программы
END START								; конец программы
  • Вопрос задан
  • 418 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
MOV AL, ARRAY_X[SI]
IMUL BX

Это неправильно: IMUL BX умножает AX на BX, а загружается из памяти только AL. Нужно либо знаково расширять AL в AX, либо, что логичнее, умножать AL на BL.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
freeExec
@freeExec
Участник OpenStreetMap
Должно же работать как
MOV AL, ARRAY_X[SI - 1]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы