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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 5.00
I_like_C++
29 / 29 / 4
Регистрация: 15.03.2010
Сообщений: 146
Завершенные тесты: 1
#1

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

14.04.2011, 12:33. Просмотров 2956. Ответов 7
Метки нет (Все метки)

Подскажите, пожалуйста, как в таких вставках в C++ сделтаь массив чисел (или строк)
везде написано одно и то же, вот как здесь http://www.kolasc.net.ru/cdo/programmes/assembler/massiv.html

но на этот код компилятор "ругается"

напишите как:
  • создать массив
  • заполнить массив
  • осуществляется доступ к элементам
по возможности
  • удаление элементов(можно ли удалять средние или первые элементы массива, как "erase" в векторе? )
  • сортировка


Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2011, 12:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ассемблеровские вставки в C++ (C++):

Ассемблеровские вставки - C++
Пользуюсь на C++ ассемблеровскими вставками, как на assembler хранить число типа double (8 байт), если регистры вмещают по 4 байта.

Скажите в чем разница?? (Ассемблеровские вставки C++) - C++
здравствуйте! написал программу на C++ с помощью ассемблеровских вставок: "Подсчитать, сколько раз в данной строке встречается буква...

С++ и шестнадцатиричные вставки - C++
не раз встречал в примерах С++ встречал вставки по типу 0x... очень бы хотелось этим научиться пользоваться. гугл не ответил на мой вопрос...

Ассемблерные вставки - C++
Будут ли у меня проблемы, если я, поработав с регистрами, не восстановлю их после выхода из вставки? Если проблем не будет, то их не будет...

Ассемблерные вставки в C++ - C++
Собственно сабж ...: Имею следующий код : short Carry = 2; unsigned short Mas; Mas = 12; Mas = 13; Mas = 14; Пытаюсь , в...

Метод вставки - C++
Расположение массива в порядке убывания методом вставки!!! Как это? Я просто саму задачу не понимаю, решить, думаю, смогу??? По убыванию...

7
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
14.04.2011, 14:19 #2
На встроенном всё можно, только не нужны дериктивы оформлять компилятор 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
I_like_C++
29 / 29 / 4
Регистрация: 15.03.2010
Сообщений: 146
Завершенные тесты: 1
14.04.2011, 14:43  [ТС] #3
спасибо, но это через указатели и как то все слишком объектно-ориентировано=)
ооп быстро можно переделать в процедурное и это не так важно, как твоя реализация, собственно, самого массива

ты создал массив как обычно и уже во вставках манипулируешь указателями, а мне бы хотелось, чтоб от начала(создание массива) и до конца(очищение/удаление массива) все было реализоано с помощью вставок, если вообще можно объвлять массив вставками (потому что если подумать, то обычные переменные типа int, double объявляются как обычно)

так можно вообще объявить массив в ассемблеровских вставках?
0
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
15.04.2011, 14:38 #4
Видишь при объявление массива во вставках нужна манипуляция в сегменте данных в глобальной области, а компилер С++ будет перестраивать объект или ты хотел всё локально в стеке. Тогда вообще всё легко заранеия статика я не знаю что за проблема у тебя такая это же элементарно, используй тогда MASM - модуль extern его легко подцепить к C++.
1
I_like_C++
29 / 29 / 4
Регистрация: 15.03.2010
Сообщений: 146
Завершенные тесты: 1
28.04.2011, 16:54  [ТС] #5
Еще вопрос=)

как теперь передать указатель на двумерный массив (матрицу)??

вот создаю я двумерный массив
C++
1
int* arr[10][20]
как мне теперь его представить во вставках?
0
I_like_C++
29 / 29 / 4
Регистрация: 15.03.2010
Сообщений: 146
Завершенные тесты: 1
06.05.2011, 19:05  [ТС] #6
Скажите что за ошибка??

1>c:\users\админ\documents\visual studio 2008\projects\asm\asm1.cpp(86) : warning C4405: 'eax' : identifier is reserved word
1>c:\users\админ\documents\visual studio 2008\projects\asm\asm1.cpp(86) : error C2400: inline assembler syntax error in 'opcode'; found 'eax'

тыЩу раз сравнивал так элементы и все Ок было, а сейчас =/

Задание:
"Дана последовательность слов. Напечатать все слова, отличные от слова "hello" . "

На функции не смотрите, я ими не горжусь=)) но они работают

Не вводите ничего кроме английских букв и пробелов (двойные пробелы и т.д тоже нельзя), в конце строки пробелов быть не должно
Пример строки: "first second third";

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
#include <iostream>
#include <string>
using namespace std;
int prob(const string & str)
{
    int kol=0;
    int n= str.size();
    for(int i=0; i<n; i++)
            if(str[i]==32)
                ++kol;
    return kol;
}
char **arr(string str)
{
        int n=str.size();
        int kol_prob=prob(str);
        
        char **mas=new char *[kol_prob+2];//резервируем под количество слов
        
        for(int i=0, f=0; i<n; i++)
        {
            if(str[i]==' ')
            {
                string temp=str;
                temp.erase(temp.begin()+i, temp.end());//получаем слово
                str.erase(str.begin(), str.begin()+i+1);//удаляем включая пробел
                n-=i+1;//уменьшаем размер соразмерно удалению
                mas[f]=new char [i+1];//резервируем память под массив
                for(int j=0; j<(int)temp.size(); j++)
                    mas[f][j]=temp[j];
                //mas[f]=(char*)temp.c_str();
                mas[f][temp.size()]='\0';
                i=0;//на начало
                f++;
                continue;
            }
            if(f==kol_prob && i==n-1)
            {
                //последнего слова
                string temp=str;
                temp.erase(temp.begin()+i+1, temp.end());//получаем слово
                str.erase(str.begin(), str.begin()+i+1);//удаляем включая пробел
                n-=i+1;//уменьшаем размер соразмерно удалению
                mas[f]=new char [i+1];//резервируем память под массив
                for(int j=0; j<(int)temp.size(); j++)
                    mas[f][j]=temp[j];
                //mas[f]=(char*)temp.c_str();
                mas[f][temp.size()]='\0';
                //i=0;//на начало
                f++;
            }
        }
        mas[kol_prob+1]='\0';
        return mas;
}
int main()
{
        setlocale(0,"");
        char b[]={'h','e','l','l','o'};
        int b_size = sizeof b;
 
        string str;
  
        cout << "Введите строку: ";
        getline(cin,str);
    
        int N=0, M=0;
        char **a=arr(str);
 
        while(a[N]!='\0')//узнаю количество слов
            N++;
        for(int i=0; i<N; i++)
        {
            while(a[i][M]!='\0')//узнаю количество символов в слове
                M++;
            
            char *f=new char [M+1];
            for(int j=0; j<M; j++)
                f[j]=a[i][j];
            f[M]='\0';
 
            _asm 
            {
                mov eax, M
                mov ebx, b_size
                сmp eax, ebx //сравниваем размер слов
                jne print//если не равны то напечатать слово
                //иначе
                mov edx, eax    // edx - размер слова
                mov esi,f       //адрес таблицы в регистре esi
                lodsb       // загружаем в al испытуемый символ из слова
                lea ebx, b      //ebx - массив "hello"
l_next_char:// проверяем следующий символ
                test edx, edx // сначала убеждаемся, что слово ещё не кончилась
                jz next_word
 
                cmp al, byte ptr [ebx]// сравниваем символ из слова с текущим символом в массиве "hello"
                je l_found// если они совпадают, переходим по метке l_found
                // иначе печатаем это слово
                jmp print
l_found:// буквы совпали
            dec edx// уменьшаем счётчик оставшихся для проверки символов
            // и переходим к следующему символу
            jmp l_next_char
print:
            }
            for(int j=0;f[j]!='\0'; j++)
                cout<<f[j];
            cout<<" ";
next_word:
            M=0;//обнуляем размер слова, чтоб перейти к другому
        }       
        system("pause");
        return 0;
}
0
ValeryLaptev
Эксперт С++
1042 / 821 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.05.2011, 20:04 #7
У тебя случаем в коде cmp русская буква не проскочила?
Как будто код операции игнорировался, и eax компилятор посчитал за код операции...
1
I_like_C++
29 / 29 / 4
Регистрация: 15.03.2010
Сообщений: 146
Завершенные тесты: 1
06.05.2011, 20:08  [ТС] #8
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
У тебя случаем в коде cmp русская буква не проскочила?
Как будто код операции игнорировался, и eax компилятор посчитал за код операции...
епооо...блин точно=) спасиб
0
06.05.2011, 20:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2011, 20:08
Привет! Вот еще темы с ответами:

бинарные вставки - C++
укажите на ошибку пожалуйста! stroka1=stroka2; for (h=1;h&lt;=k;h++) { if (stroka1&gt;=stroka2) R=h; else { ...

Метод вставки - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int main() { const int n = 10; int a; int key = 0, j = 0; ...

Ассемблерские вставки. - C++
void main(void) { __asm { mov ah,2h mov al,'A' xor bx,bx int 10h } }

Ассеблерные вставки в C++ - C++
Потребовалось написать простенький, по идее код, в котором замерялось бы количество тактов процессора, затрачиваемых на определенный...


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

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

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