I
I
Im p3l2018-03-31 17:22:45
assembler
Im p3l, 2018-03-31 17:22:45

How to change array index in assembler?

Good afternoon, I ask for help in the program.
How to make the first term in the program refer to X[i-1] instead of X[i] in the formula Y[i]=A* X[i-1] + B*X[i]
Now in the program just 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								; конец программы

Answer the question

In order to leave comments, you need to log in

2 answer(s)
J
jcmvbkbc, 2018-03-31
@LoranDeMarcus

MOV AL, ARRAY_X[SI]
IMUL BX

This is wrong: IMUL BX multiplies AX by BX, and only AL is loaded from memory. One must either sign-extend AL to AX, or, more logically, multiply AL by BL.

F
freeExec, 2018-03-31
@freeExec

Should work like
MOV AL, ARRAY_X[SI - 1]

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question