Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Ассемблеровские вставки в C++ - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ многовымерние масиви http://www.cyberforum.ru/cpp-beginners/thread276265.html
Элемент матрицы назовем седловой точки, если он является наименьшим в своей строке и одновременно крупнейшим в своем столбце или, наоборот, является крупнейшим в своей строке и наименьшим в своем...
C++ Вычислить сумму ряда Вычислить сумму ряда: S=3/2!+(5+9)/4!+(7+13+19)/6!+... N=2,4,6,8,10...(число стоящее в знаменателе-задается с экрана)! Код реализовать в Си. Заранее благодарен откликнувшимся. Добавлено через... http://www.cyberforum.ru/cpp-beginners/thread276261.html
C++ Раздробить слово
Дано слово: "write('a=c-b.vv" Как создать массивы: со словами {write,vv}, с переменными {a,b,c}, со знаками {(,',=,-,.},
Создать класс "участник" C++
Доброго времени суток, форумчане!!! Сейчас прохожу тему по С++ "Классы" и пока не очень догоняю. А тут препод сразу такое задание дал: 1. Класс “участник”: фамилия, телефон, адрес. 2....
C++ Указатели http://www.cyberforum.ru/cpp-beginners/thread276250.html
Размерность массива 100 Диапазон значений -50 до 50 Во всех последовательностях отрицательных чисел уменьшить на среднее те элементы, абсолютное значение которых превышает абсолютное...
C++ Динамическое выдиление памяти Написать программу для обработки массивов. Все массивы создаются путем динамического выделения памяти. Доступ к их элементов производится с помощью исключительно указателей. Подсчитать... подробнее

Показать сообщение отдельно
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
14.04.2011, 14:19
На встроенном всё можно, только не нужны дериктивы оформлять компилятор C++ всё сам добавит, для 32 - разрядных приложений во основном используется модель память flat, вот начиркал.

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
class  asm_array {
private:
     int*   arr;
     unsigned int cnt;
     unsigned int size;
public:
     asm_array(void) : arr(NULL), cnt(0u), size(0u) {}
 
     // память выделить C++ способом под массив
    void    reserve(unsigned int hSize) {
    if(arr)
       delete[] arr;
     arr    = NULL;
     arr    = new int[hSize];
     size = hSize;
    }
 
    // добавление в массив
   void   add(int hNum) {
    int*  p = arr;
             unsigned int  sz = cnt;
    __asm {
                 mov edx, dword ptr sz
        mov ebx, dword ptr hNum
        mov esi, p
        mov [esi+edx*4], ebx
        adc dword ptr sz, 1
       };
       cnt = sz;
   }
 
   // получение  значение массива по-индексу
   int get(unsigned int hIndex) {
     int*  p      = arr;
     int   num = 0;
    __asm {
                    mov esi, p
           mov edx, dword ptr hIndex
           mov ebx,  [esi+edx*4]
           mov dword ptr num, ebx
    };
    return  num;
     }
 
    // присвоить данные по-индексу
    void set(unsigned int hIndex, int hNum) {
    int*  p   = arr;
    __asm {
             mov esi, p
             mov ebx, dword ptr hNum
             mov edx, dword ptr hIndex
             mov [esi+edx*4], ebx
    };
      }
 
      // удалить элемент из массива по-индексу
      void  remove(unsigned int hIndex) {
    int* p = arr;
    unsigned int sz = cnt - 1;
    __asm {
         push ecx
         mov esi, p
         mov edx, dword ptr hIndex
next:
                  mov ebx, [esi+edx*4+4]
                  mov [esi+edx*4], ebx
         inc edx
         cmp edx, dword ptr sz
         jb   next;
         dec  dword ptr sz
         pop  ecx
    };
    cnt = sz;
      }
 
     // сортировать массив от меньшего к большему
     void  sort(void) {
    int* p = arr;
             unsigned int sz = cnt;
             __asm {
             push ecx
             mov ecx, dword ptr  sz
next:
             mov esi, p
             mov ebx, dword ptr sz
             dec  ebx
all:
                      mov edx,  [esi]
             cmp edx,  [esi + 4]
             jle   no;
             mov  edx,  [esi]
             xchg [esi + 4], edx
             mov [esi], edx
no:
            add  esi, 4
                    dec  ebx
                     jnz    all;
            dec  ecx
            jnz    next;
            pop ecx
            };
      }
 
      // возвращает количество  элементов в массиве
     unsigned int get_count(void) const {
    return  cnt;
     }
 
    // возвращает размер зарезервированной памяти для массива
    unsigned int  get_size(void) const {
    return  size;
     }
     // чистка кучи
     void clear(void) {
    if(arr)
        delete[] arr;
    arr = NULL;
             size = cnt = 0u;
      }
};
 
 
// тестим
 
void main() {
 
asm_array arr;
arr.reserve(7);  // выделяем память для массива из 7-ов
 
// заполняем массив числ-данными
arr.add(100);
arr.add(300);
arr.add(-700);
arr.add(200);
arr.add(400);
arr.add(9);
arr.add(130);
 
arr.remove(2);  // удалить третий элемент
 
arr.set(1, -5);  // присвоить второму элементу значение
 
arr.remove(0);  // удалить самый первый элемент
 
arr.sort();   // сортируем
 
// выводим
     for(int i =0 ; i < arr.get_count(); i++)
    printf("%d\n", arr.get(i));
 
arr.clear();
 
 
}
Я как понил ты хотел таким образом испытать встроенный asm или массив хотел создавать
в сегменте данных.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru