Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Life Crusher
3 / 3 / 1
Регистрация: 27.12.2013
Сообщений: 77
1

Переданный по указателю в ассемблерную вставку массив не меняется

05.12.2014, 23:51. Просмотров 260. Ответов 4
Метки нет (Все метки)

Есть функция для сортировки массива с ассемблерной вставкой на си.Дабы изменить массив, он передается в функцию по указателю, но после выхода из функции массив остается неизменным. В чем ошибка?
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
#include <stdio.h>
#include <conio.h>
#include <locale>
#define   MAX_LENGTH  100
 
 
void ToSort(long *Arr[], long len);
 
void main()
{   
    long int  *inArr[MAX_LENGTH];
    int len;
    FILE *fin, *fout;
    fopen_s(&fin, "525b_V27_LW6.in", "rt");
    fopen_s(&fout, "525b_V27_LW6.out", "wt");
    // Читать длину масива
    fscanf_s(fin, "%i\n", &len);
    // Если массив имеет ненулевую и допустимую длину, читать его
    if (len == 0 || MAX_LENGTH > 100)
    fprintf(fout, "Массив имеет нулевую или предельную длину\n");
    else{
        // Копировать файл в массив
        for (int i = 0; i < len; i++)
            fscanf_s(fin, "%i", &inArr[i]);}
 
    ToSort(inArr, len);
    for (int i = 0; i < len; i++)
 
    fprintf(fout, "%d ",inArr[i]);
    fprintf(fout, "\n______________________________\n");
 
}
    void ToSort(long *Arr[], long len)
    {
      __asm
        {   
            mov esi, Arr
            mov ecx, len
            L0 :
            mov edi, esi
            inc edi
            L1 :
            mov eax,[esi]
            cmp [edi], eax
            jg  L2
            xchg eax,[edi]
            xchg eax,[esi ]
            L2:
            add edi,4
            cmp  edi, ecx
            jl   L1
            add  esi,4
            mov ebx, esi
            inc ebx
            cmp ebx, ecx
            jl  L0
      };
            }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2014, 23:51
Ответы с готовыми решениями:

Переписать используя ассемблерную вставку
Есть подпрограмма написанная на С++: void sion(char *&amp;str){ int len = 0; for(;str; len++);...

Построить гиперболу, используя ассемблерную вставку
в Borland Pascal, используя средства Assembler, нарисовать ветвь гиперболы 1/x, x&gt;0. Рисунок по...

Написать ассемблерную вставку, реализующую обработку строки
Написать ассемблерную вставку, реализующую обработку строки. Даны 2 строки. Совместить половину...

Вычисление суммы ряда через ассемблерную вставку
Вычислить сумму ряда , используя ассемблерные вставки. Фото вставил внизу! программа должна быть на...

Реализовать вычисление выражения как ассемблерную вставку
Есть выражение, вывод которого должен выводиться в консоль как через АСМ, так и С++. С с++ все...

4
Thread
programmer
1871 / 343 / 27
Регистрация: 01.06.2011
Сообщений: 3,047
Записей в блоге: 1
06.12.2014, 01:21 2
Life Crusher,

посмотри под отладчиком на выходе из ф-ции сам массив.
Может алгоритм неправильно составлен ,потому как изменения должны оставаться и при выходе.
0
Life Crusher
3 / 3 / 1
Регистрация: 27.12.2013
Сообщений: 77
06.12.2014, 01:58  [ТС] 3
Проверял в масме алгоритм.Работает.

Добавлено через 22 минуты
Хотя нет, тот был немного другой
0
Thread
programmer
1871 / 343 / 27
Регистрация: 01.06.2011
Сообщений: 3,047
Записей в блоге: 1
06.12.2014, 02:17 4
Life Crusher,

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

Добавлено через 3 минуты
p.s и как вы хотите научиться программировать,если ни в какую не желаете пользоваться отладчиками?
Преимущество ассемблерщиков видимо в том,что с пеленок учат пользоваться средствами отладки. )
Без него как без рук.
1
Life Crusher
3 / 3 / 1
Регистрация: 27.12.2013
Сообщений: 77
06.12.2014, 12:19  [ТС] 5
Да, я понимаю. OllyDebager-ом, я могу нормально пользоваться, но со студийным мало знаком, поэтому возникают проблемы.Я понимаю, что для учебы его необходимо освоить, но сейчас я в такой ситуации, что на это уже нет времени. Освою, как смогу.Вот работающий алгоритм, может пригодятся кому-то зашедшему в этот трэд.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  mov edx, Arr
  mov ecx, len
  mov esi,0
L0:
  mov edi,esi
  inc edi
 L1 :
 mov   eax, [edx+esi*4]
 cmp  [edx+edi*4], eax
 jg L2
 xchg   eax,[edx+edi*4]
  xchg   eax, [edx+esi * 4]
L2:
 inc    edi
 cmp    edi, ecx
 jl L1
 inc    esi
 mov ebx, esi
 inc ebx
 cmp    ebx, ecx
 jl L0
0
06.12.2014, 12:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2014, 12:19

Проверка числа на полный квадрат через ассемблерную вставку
Выяснить, является ли полным квадратом натуральное число n. Например, 4 -полный квадрат. Операции...

Изменить только тело функции, т.е. создать ассемблерную вставку
Требуется изменить только тело функции, т.е. создать ассемблеровскую вставку. template &lt; class T &gt;...

Реализуйте вычисление заданного выражения как ассемблерную вставку в программе на языке высшего уровня С++
Я запихнул в С++ ассемблерную вставку. Задание было такое: Тема 2. Массивы. Примечания к...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru