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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ многовымерние масиви http://www.cyberforum.ru/cpp-beginners/thread276265.html
Элемент матрицы назовем седловой точки, если он является наименьшим в своей строке и одновременно крупнейшим в своем столбце или, наоборот, является крупнейшим в своей строке и наименьшим в своем столбце. Для заданной целой матрицы размером 10 × 15 напечатайте индексы всех ее седловых точек.
C++ Вычислить сумму ряда Вычислить сумму ряда: S=3/2!+(5+9)/4!+(7+13+19)/6!+... N=2,4,6,8,10...(число стоящее в знаменателе-задается с экрана)! Код реализовать в Си. Заранее благодарен откликнувшимся. Добавлено через 4 часа 36 минут !!!!!) 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/thread276245.html
Написать программу для обработки массивов. Все массивы создаются путем динамического выделения памяти. Доступ к их элементов производится с помощью исключительно указателей. Подсчитать количество отрезков, образующих непрерывные последовательности положительных чисел расположенных по возрастанию
C++ с++ Использование структур Даны сведения о кубиках: размер кубика, его цвет, материал.Найти количество кубиков каждого из перечисленных цветов и их суммарный объем. подробнее

Показать сообщение отдельно
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
14.04.2011, 14:19     Ассемблеровские вставки в C++
На встроенном всё можно, только не нужны дериктивы оформлять компилятор 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 или массив хотел создавать
в сегменте данных.
 
Текущее время: 01:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru