Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2013, 20:50   #1
Pras
Новичок
Джуниор
 
Регистрация: 11.06.2013
Сообщений: 2
По умолчанию Переписать элементы массива в другой массив (вставка ассемблера) на СИ

Дан массив А размерности N. Из элементов массива А сформировать массив В со следующим расположением элементов:
А(n/2), A(n/2-1), … , A(3), A(2), A(1), A(n), A(n-1), A(n-2), … , A(n/2+1)
N - четное.


Формирование происходит в вставке ассемблера (asm). Такой же алгоритм, как ниже, использовала в "чистом" ассемблере - все работало. А здесь не могу понять, что не так.

Буду благодарна помощи, которая будет способствовать тому, что я разберусь с другими подобными задачами.

P.S. Элементы записываю с i=1, это плохо, но если с i=0 начинать, то не знаю, как преобразовать вставку ассемблера. Видимо, в этом тоже заключается ошибка.
В принципе, мне главное, чтобы работало.

Код:
#include "stdafx.h"
#include <clocale>
#include <conio.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    short A[20]; //А - массив
    short B[20]; //B - массив
    short i;     //счетчик
    short n;     //количество эл-ов в массиве  
    short tmp1;  
    short tmp=0;                                     
    short N;
    //ввод кол-ва эл-ов для массивов
    printf("\nВведите кол-во эл-во массива: ");
    scanf_s("%d", &n);
    fflush(stdin);
    //ввод эл-ов массива А
    printf("\nВведите эл-ты масива А:\n");
    for(i=1; i<=n; i++)
        scanf_s("%d", &A[i]);
    N=n/2;
    //код ассемблера
        _asm
    {
        movs esi,A                    //загрузка в регистр esi адреса массива А  
        movs edi,B                    //загрузка в регистр edi адреса массива B
cycl1:  mov ax,word ptr[N]            //в ax - n/2
        sub ax,word ptr[tmp]          // (n/2-tmp)
        mov word ptr[tmp1],ax         //сохранить в tmp1 (tmp1 - и индексное смещение, и счетчик цикла)
        mov ax,[esi+tmp1]             //сохранить эл-т массива А в массиве B
        mov [edi],ax                  //переписать эл-т массива А в массив В
        inc edi                       //вычислить индекс следующего эл-та массива B
        inc word ptr[tmp]             //прибавить к tmp единицу
        mov ax,word ptr[tmp1]         //в ax загрузить tmp1
        cmp ax,1                      //сравнить tmp1 с единицей
        ja cycl1                      //при положит. результате переход на начало цикла
cycl2:  mov ax,word ptr[N]            //в ax - n/2
        add ax,word ptr[tmp]          //прибавить содержимое AX к содержимому CX (n/2+tmp); результат в AX (tmp1)
        mov word ptr[tmp1],ax         //сохранить в tmp1 (tmp1 - и индексное смещение, и счетчик цикла)
        mov ax,[esi+tmp1]             //индекс соответствующего эл-та массива А 
        mov [edi],ax                  //переписать эл-т массива А в массив В
        inc edi                       //вычислить индекс следующего эл-та массива B
        dec word ptr[tmp]             //отнять от tmp единицу
        mov ax,word ptr[tmp]          //в ax загрузить tmp
        cmp ax,0                      //сравнить tmp с нулем
        ja cycl2                      //при положит. результате переход на начало цикла     
    }
    //печать результатов
    printf("\nМассив В:\n");
    for(i=1; i<=n; i++)
        printf("%d ", B[i]);
    printf("\n");
    _getch();
    return 0;
}
Pras вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(Турбо Паскаль)Найти все положительные элементы и переписать их в массив Z Алена_ПИЭ Помощь студентам 0 20.01.2013 16:39
записать в файл последовательного доступа N произвольных натуральных чисел. переписать в другой файл элементы кратные K lililili Паскаль, Turbo Pascal, PascalABC.NET 0 29.11.2012 14:43
переписать из одного массива в другой devс++ cas2010 Помощь студентам 0 21.10.2012 12:11
Переписать елементы из одного массива в другой allegri Помощь студентам 3 03.01.2011 18:57
переписать из массива в линейный двунаправленный список чётные элементы массива Black_Ak24 Помощь студентам 12 08.01.2008 00:44