Работа с массивами на языке ассемблера
Задание:
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
Код программы:
Код:
arr_x db 0,1,2,3,4,5,6,7,8,9,10,11 ;Размер каждого элемента 1 байта
arr_y dw 7 dup (0) ;Размер каждого элемента 2 байта
N db 5
.code
main proc
; код главной функции
mov esi,0 ;esi=0
mov ecx,5 ;ecx= k=5
for_k:
movzx edx,N ;В регистр edx помещаем значение N
movsx eax,arr_x[ecx] ;В eax лежит значение X[k]
shl eax,2 ;eax=4 X[k]
;Теперь переходим к работе с X[2N-k]
shl edx,1 ;dx =2 N
sub edx,ecx ;edx=2N-k
movsx ebx,arr_x[edx] ;ebx= X[2N-k]
cwd ;знаковое расширение
idiv ebx ;eax=4*X[k]/X[2N-k]
mov arr_y[ecx*2],dx ;Y[k]=4*X[k]/X[2N-k]
;Переходим ко второй части выражения :
mov eax,ecx ;eax=ecx=k
mul ecx ;eax=k^2
movzx esi,N ;esi=N
sub esi,ecx ;esi=N-k;
imul arr_x[esi+1] ;eax=k^2*X[N+1-k]
mov ebx,ecx ;ebx=ecx=k
add ebx,1 ;ebx=k+1
idiv ebx ;eax=k^2*X[N+1-k]/(k+1)
mov esi,ecx ;esi=k
idiv arr_x[esi+1] ;eax=k^2*X[N+1-k]/(k+1)/X[k+1]
add arr_y[esi*2],ax ax=4*X[k]/X[2N-k]+k^2*X[N+1-k]/(k+1)/X[k+1]
sub ecx,1
jnz for_k
invoke ExitProcess, 0 ; завершение работы
main endp
end main
arr_y dw 7 dup (0) ;Размер каждого элемента 2 байта
N db 5
.code
main proc
; код главной функции
mov esi,0 ;esi=0
mov ecx,5 ;ecx= k=5
for_k:
movzx edx,N ;В регистр edx помещаем значение N
movsx eax,arr_x[ecx] ;В eax лежит значение X[k]
shl eax,2 ;eax=4 X[k]
;Теперь переходим к работе с X[2N-k]
shl edx,1 ;dx =2 N
sub edx,ecx ;edx=2N-k
movsx ebx,arr_x[edx] ;ebx= X[2N-k]
cwd ;знаковое расширение
idiv ebx ;eax=4*X[k]/X[2N-k]
mov arr_y[ecx*2],dx ;Y[k]=4*X[k]/X[2N-k]
;Переходим ко второй части выражения :
mov eax,ecx ;eax=ecx=k
mul ecx ;eax=k^2
movzx esi,N ;esi=N
sub esi,ecx ;esi=N-k;
imul arr_x[esi+1] ;eax=k^2*X[N+1-k]
mov ebx,ecx ;ebx=ecx=k
add ebx,1 ;ebx=k+1
idiv ebx ;eax=k^2*X[N+1-k]/(k+1)
mov esi,ecx ;esi=k
idiv arr_x[esi+1] ;eax=k^2*X[N+1-k]/(k+1)/X[k+1]
add arr_y[esi*2],ax ax=4*X[k]/X[2N-k]+k^2*X[N+1-k]/(k+1)/X[k+1]
sub ecx,1
jnz for_k
invoke ExitProcess, 0 ; завершение работы
main endp
end main
Код:
.386
MASM
MODEL use16 small
STACK 256
MASM
MODEL use16 small
STACK 256
Судя по invoke ExitProcess -- MASM32 SDK для Windows само собой :)
Цитата: sadovoya
Судя по invoke ExitProcess -- MASM32 SDK для Windows само собой :)
Ну для мня с Вами это не вопрос -это понятно. +1
Я про ТУПО- (думаю там ,что OS, что MASM одна каша из тыквы)
А откуда берется массив X[]? По Вашей формуле получается, что на первом же этапе вычисления X[2 * N - k] = X[9].
P.S. Для целочисленной арифметики и данных массивов (еще полагая, что индексация массивов с нуля начинается) нормальным будет на выходе такой массив Y:
0 1 2 2 3 4 0
И такому ответу не стоит удивляться. Эквивалент на С++:
Код:
#include <cstdio>
int main() {
const int X[12] = {0,1,2,3,4,5,6,7,8,9,10,11};
int Y[7] = {0,0,0,0,0,0,0};
const int N = 5;
for(int k = 1; k <= 5; k++)
Y[k] = 4*X[k]/X[2*N-k] + k*k*X[N+1-k]/(k+1)/X[k+1];
for(int i = 0; i < 12; i++)
printf("%d ", X[i]);
printf("\n\n");
for(int k = 0; k < 7; k++)
printf("%d ", Y[k]);
printf("\n");
return 0;
}
int main() {
const int X[12] = {0,1,2,3,4,5,6,7,8,9,10,11};
int Y[7] = {0,0,0,0,0,0,0};
const int N = 5;
for(int k = 1; k <= 5; k++)
Y[k] = 4*X[k]/X[2*N-k] + k*k*X[N+1-k]/(k+1)/X[k+1];
for(int i = 0; i < 12; i++)
printf("%d ", X[i]);
printf("\n\n");
for(int k = 0; k < 7; k++)
printf("%d ", Y[k]);
printf("\n");
return 0;
}
0.000000 1.694444 2.777778 3.401786 3.946667 4.694444 0.000000
(получено аналогичным кодом для double в С++)