Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 1
Регистрация: 21.11.2016
Сообщений: 7
1

Перенос элементов из одного массива в другой (ассемблерная вставка)

11.03.2017, 17:58. Показов 2383. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Перенос элементов из одного массива в другой, так чтобы в правой части были элементы меньше 0, а слева больше 0
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
...
 
const int n = 5;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int X[n],Y[n];
    int i;
    int k1 = 0;
    int k2 = n-1;
 
    srand(time(NULL));
    for (i = 0; i < n; i++)
    {
        X[i] = rand() % 15 - 5;
        printf(" %d",X[i]);
    }
    _asm
    {
       
            xor eax, eax
            xor edx, edx
            lea esi, X
            lea edi, Y
            mov ecx, n
 
        c1 : mov ebx, [esi]  
             cmp ebx, 0  
             jl a2 
             jg a1
       c2 :        
             loop c1
             jmp quit
 
    a1:
           mov Y[k1],ebx   //помещаем элемент в левую половину массива
           inc k1              //смещаем индекс свободной позиции слева
       add esi, 4
       add edi, 4
           jmp c2
    a2:
        mov Y[k2],ebx      // помещаем элемент в правую половину массива
        dec k2                // смещаем индекс свободной позиции справа
    add esi, 4
    add edi, 4
        jmp c2 
 
    quit:
    
    }
    printf("\nMassiv Y\n");
    for (i = 0; i < n; i++)
        printf("\n%d", Y[i]);
    printf("\n");
    system("pause");
    return 0;
}
но при выполнении программа останавливается на строках:
mov Y[k1],ebx или mov Y[k2],ebx
и выскакивает ошибка:
Перенос элементов из одного массива в другой (ассемблерная вставка)

как решить проблему?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2017, 17:58
Ответы с готовыми решениями:

Перенос элементов из одного массива в другой
Дано два случайно заполненных массива. Нужно скопировать (или переместить - как удобнее)...

Сумма элементов массива, равных первому элементу массива (Ассемблерная вставка с++)
помогите кто может, или просто дайте код где в асемлерной вставке используют масив, дальше разберусь

Вычислить сумму элементов массива (ассемблерная вставка в C++)
Нужно написать функции на С++ с вставками из ассемблера х86. Первая функция работает правильно, при...

Ассемблерная вставка: Определить среднее значение положительных элементов массива
Доброго времени суток! такое задание, определить среднее значение положительных элементов массива...

3
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
11.03.2017, 20:18 2
Лучший ответ Сообщение было отмечено Andrond как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include "stdafx.h"
#include <iostream>
#include <ctime>
 
const int n = 5;
int main()
{
    int X[n], Y[n];
    int i;
    int k1 = 0;
    int k2 = 1;
 
    srand(time(NULL));
    for (i = 0; i < n; i++)
    {
        X[i] = rand() % 15 - 5;
        printf(" %d", X[i]);
    }
    _asm
    {
        xor edx, edX
        lea esi, X
        lea edi, Y
        mov ecx, n
 
        c1 : 
             mov ebx, [esi]
             cmp ebx, 0
             jl a2
 
            xor eax, eax
            mov edx, k1
            imul edx, 4 
            mov[edi + edx], ebx
            inc k1              
            add esi, 4
 
        c2:
            loop c1
            jmp quit
 
            a2 :
            xor eax,eax
            mov eax,20
            mov edx,k2
            imul edx,4
            sub eax,edx
            mov [edi+eax], ebx     
            inc k2                
            add esi, 4
            jmp c2
 
            quit :
    }
    printf("\nMassiv Y\n");
    for (i = 0; i < n; i++)
        printf("\n%d", Y[i]);
    printf("\n");
    system("pause");
    return 0;
}
2
0 / 0 / 1
Регистрация: 21.11.2016
Сообщений: 7
13.03.2017, 18:53  [ТС] 3
То что нужно, спасибо.
И ещё есть пара вопросов:
а что происходит в этих строчках:
Цитата Сообщение от мановар Посмотреть сообщение
mov edx, k1
* * * * * * imul edx, 4
* * * * * * mov[edi + edx], ebx
и вот тут:
Цитата Сообщение от мановар Посмотреть сообщение
mov eax,20
* * * * * * mov edx,k2
* * * * * * imul edx,4
* * * * * * sub eax,edx
* * * * * * mov [edi+eax], ebx
0
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
14.03.2017, 06:30 4
Думал разберешься, да заодно ненужные строки поудаляешь. В этих строчках мы вычисляем адрес смещения по которому будет записываться массив Y. Особо объяснять не умею (легче сделать), но попробую. Под массив Y программа выделяет память для 5 элементов. Команда lea, (строка 22,23) загружает в регистр, указанный в команде в качестве первого операнда, относительный адрес второго операнда (не значение операнда!) т.е. нашего массива. Так как элементы массива типа int, то каждый из них занимает 4 байта. Адрес нашего первого элемента считается нулевым Y[0] = [0] (0 в правой части - это адрес, не значение) Второго элемента Y[1] = [4], Y[2] = [8], Y[3] = [12], Y[4] = [16]. Т.е. можно записать [0 + X] где X - наше смещение (4,8,12,16). Допустим первый элемент X[0] = -3 тогда в eax = 20, edx = 1 (k2=1), edx = 1*4=4, eax=20-4=16. И командой mov [edi+eax], ebx занесли число X[0] по вычисленному адресу, Y[4] = -3. Увеличили к2 на 1. Второй элемент X[1] = -5 по старой аналогии в eax = 20, edx = 2 (k2=2), edx=2*4=8, eax=20-8=12 и т.д. Y[3] = -5. Третий элемент X[2] =6. edx=0 (k1=0) edx=0 * 4 =0, увеличили наш счетчик положительных элементов k1 Т.е. по адресу [0] у нас будет записан Y[0] = 6 и т.д.
Если что то не так прошу простить, т.к. только приехал с вахты и толком не спал.
0
14.03.2017, 06:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2017, 06:30
Помогаю со студенческими работами здесь

Найти сумму первых К положительных элементов массива (ассемблерная вставка в C++)
Может тут кто-то знает как находить сумму только не для всех, а для нескольких первых элементов...

Вставка одного массива в другой
Есть вот такие вот 2 задачки- 1) даны 2 массива А и В. нужно вставить один массив в другой, при...

Вставка одного массива в другой.
Имеются 2 массива, содержащие последовательности целых чисел.В первом из указанных массивов числа...

Вставка элементов одного вектора в другой
Дан вектор А и вектор B. В векторе А за максимальным элементом вставить все элементы вектора B.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru