Код:
; Y[k] = 4*X[k]/X[2N-k] + k**2*X[N+1-k]/(k+1)/X[k+1] N=5 k=1,2,...5
nata segment 'code'
assume cs:nata, ds:nata, ss:nata, es:nata
org 100h
begin:
jmp main
;------------Для ввода ---------------------
Buf db 7,0,7 DUP(?)
datev dw 0
mnoj dw ?
ps dw 10,13,'$'
;------------Для вывода ---------------------
date dw ?
my_s db '+'
T_Th db ?
Th db ?
Hu db ?
Tens db ?
Ones db ?
;---------------------------------
;Q dw ?
;T dw ?
N dw 6
K dw ?
vvodX db 10,13,'Vvedite element massiva X!',10,13,'$'
vivX db 10,13,'Massiv X:',10,13,'$'
vivY db 10,13,'Massiv Y:',10,13,'$'
X dw 11 DUP(?)
Y dw 5 DUP(?)
;---------------------------------
main proc near
; *************** Заполнение массива X ***************
cld
mov cx, 11 ; 11 элементов массива X
lea di, X ; загружаем в si адрес первого элемента массива X
@XVVOD:
push cx ; сохраняем в стеке счетчик цикла
; Выводим подсказку
mov ah, 09
lea dx, vvodX
int 21h
; вводим один элемент массива
call vvod
mov ax, datev ; datev - очередной элемент
; mov [si], ax ; сохраняем элемент по адресу
; add si, 2 ; наращиваем адрес на 2
stosw
pop cx
loop @XVVOD
; *************** конец заполнения массива X ***************
;*************** Вывод массива X **********************
mov ah, 09
lea dx, vivX
int 21h
mov cx, 11
lea si, X ; адрес первого элемента
@XVIVOD:
push cx
; mov ax, [si] ; берем очередной элемент
; add si, 2 ; наращиваем адрес на 2
lodsw
mov date, ax
; выводим элемент на экран
call vivod
pop cx
loop @XVIVOD
; перевод строки
mov ah, 09
lea dx, ps
int 21h
; *************** Конец вывода массива X ***************
; Y[k] = 4*X[k]/X[2N-k] + k**2*X[N+1-k]/(k+1)/X[k+1] N=5 k=1,2,...5 (тут 5 элементов, а не 6)
; ********** Расчёт элементов массива Y
mov cx, 5 ; считаем 6 элементов массива Y
mov k, 1 ; просто значение K
; mov bp, 0 ; индекс элемента в массиве Y
lea di, Y ; Если использовать bp, тогда надо явно задавать сегмент данных. bp адресуется относительно ss
@MY:
; push cx
; ***** Считаем первое слагаемое ************
; считаем адрес элемента 2N-K
mov si, N
; mov bx, 2
; imul bx ; ax=2*N
add si, si ; ax=2 * N
sub si, k ; ax=2*N - K
; sub ax, 1 ; ax=(2*N-K)-1
dec si ; ax=(2*N-K) - 1
; mov bx, 2
; imul bx ; ax=((2*N-K)-1)*2
add si, si ; ax=((2*N-K)-1) * 2
; mov si, ax ; si=ax=((2*N-K)-1)*2
mov bx, word ptr [X+si] ; берем элемент X(2N-K)
; считаем адрес элемента K
mov si, k
; sub si, 1 ; ax=k-1
dec si ; si=k - 1
; mov bx, 2
; imul bx
add si, si ; ax=(k-1) * 2
; mov si, ax ; si=ax=(k-1)*2
; mov ax, word ptr [X+si] ; берем элемент X(K)
; mov bx, 4
; imul bx ; ax=4*X(K)
imul ax, word ptr [X+si], 4 ; ax=4*X[k]
; mov T, ax ; T=4*X(K)
; делим 4*X(K) на X(2N-K)
; mov bx, ax
; mov ax, T
cwd ; ax->dx:ax
idiv bx ; ax=4*X(K) / X(2N-K)
; mov T, ax ; T=4*X(K) / X(2N-K)
mov bp, ax ; di=4*X(K)/X(2N-K)
; **** Считаем второе слагаемое
; высчитываем адрес элемента с номером N+1-k
mov si, N
; add si, 1
; inc si
sub si, k ; ax=N+1 - k
; высчитываем смещение относительно начала массива X
; sub si, 1
; dec si ; это можно сократить, иначе зачем считать N+1-k-1
; mov bx, 2
; imul bx ; ax=смещение
add si, si ; si=смещение
; mov si, ax
; mov bx, word ptr [X+si] ; берем элемент X(N+1-K)
; imul k ; ax=X(N+1-K)^2 * k
; imul k ; ax=X(N+1-K)^2 * k * k
mov ax, k
imul ax ; ax=k * k; ax=X(N+1-K)^2
imul word ptr [X+si] ; ax=k*k * X[N+1-k]
mov bx, k
inc bx
idiv bx ; ax=k*k*X[N+1-k] / (k+1)
; mov Q, ax ; Q=k*k*X[N+1-k]/(k+1) ; Q=X(N+1-K)^2 * k * k
; высчитываем адрес элемента X(K+1)
mov si, k
; add ax, 1 ; ax=k+1 ; Это можно сократить
; sub ax, 1
; mov bx, 2
; imul bx ; ax=смещение
add si, si ; si=смещение
; mov si, ax
; mov ax, word ptr [X+si] ; ax = X(K+1)
cwd
idiv word ptr [X+si] ; ax=k*k*X[N+1-k]/(k+1) / X[k+1]
add ax, bp ; ax=4*X(K)/X(2N-K) + k*k*X[N+1-k]/(k+1)/X[k+1]
; высчитываем k+1
; mov bx, k
; add bx, 1 ; bx = K+1
; умножаем
; imul bx ; ax=(K+1)*X(K+1)
; делим X(N+1-K)^2 * k * k на (K+1)*X(K+1)
; mov bx, ax
; mov ax, Q
; cwd ; ax->dx:ax
; idiv bx ; ax=X(N+1-K)^2 * k * k / (K+1)*X(K+1)
; складываем слагаемые
; add ax, T
; заносим высчитанное в элемент массива Y
; mov Y+bp, ax
stosw ; Y[di]=ax
; наращиваем k на 1
; add k, 1
inc k
; переходим к след.элементу массива Y
; add bp, 2
; pop cx
; sub cx, 1
; cmp cx, 0
; je @FIN
loop @MY
; jmp @MY
; Забыли вывести массив Y
mov ah, 09
lea dx, vivY
int 21h
mov cx, 5
lea si, Y ; адрес первого элемента
@YVIVOD:
push cx
lodsw
mov date, ax
; выводим элемент на экран
call vivod
pop cx
loop @YVIVOD
; перевод строки
mov ah, 09
lea dx, ps
int 21h
; Выход в DOS
mov ax, 4C00h
int 21h
main endp
;nata ends
;end main
; Подозреваю, что подпрограммы vvod и vivod вы забыли написать. Оставлю это удовольствие вам