Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с массивами на языке ассемблера

92K
12 декабря 2013 года
vladis222
1 / / 12.12.2013
Здравствуйте,прошу вашей помощи в лабораторной работе,связанной с массивами на языке ассемблера.
Задание:
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) в значениях находятся явно неверные значения, объясните пожалуйста в чем ошибка в этом коде?
327
13 декабря 2013 года
UserNet2008
748 / / 03.04.2010
Мне хватило быстрого взгляда, что код тупо- скопирован т.к не хватает этого:
 
Код:
.386
MASM
MODEL use16 small
STACK 256
Укажите OS+среду , где Вы программируете Assembler.
326
13 декабря 2013 года
sadovoya
757 / / 19.11.2005
Судя по invoke ExitProcess -- MASM32 SDK для Windows само собой :)
327
13 декабря 2013 года
UserNet2008
748 / / 03.04.2010
Цитата: sadovoya
Судя по invoke ExitProcess -- MASM32 SDK для Windows само собой :)


Ну для мня с Вами это не вопрос -это понятно. +1
Я про ТУПО- (думаю там ,что OS, что MASM одна каша из тыквы)

27K
14 декабря 2013 года
mnanorn
78 / / 01.12.2013
Здравствуйте!

А откуда берется массив X[]? По Вашей формуле получается, что на первом же этапе вычисления X[2 * N - k] = X[9].
326
14 декабря 2013 года
sadovoya
757 / / 19.11.2005
Судя по формуле, для массива X используются индексы от 1 до 9, для Y -- от 1 до 5. У автора под элементы массивов выделено 12 и 7 мест. Тут еще ошибки нет, главное не запутаться с индексацией. Правда расточительность непонятна все-равно. .. И другое непонятно: какого "правильного" результата ждал автор и где он его вообще выводит, кстати? Смотрит в отладчике? Для целочисленной арифметики (тем более с делением), как здесь, ответ один, при вещественной другой. В задаче что сказано о типе результата и арифметике?

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;
}
Ну, а для вещественной такой:

0.000000 1.694444 2.777778 3.401786 3.946667 4.694444 0.000000

(получено аналогичным кодом для double в С++)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог