Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/35: Рейтинг темы: голосов - 35, средняя оценка - 4.71
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101

Обращение к переменным объекта с использованием указателя this из inline assembler

21.09.2009, 22:15. Показов 7509. Ответов 74
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно написать класс на С++ с учетом возможности ввода количества столбцов и строк матрицы. Матрица должна размещаться в динамической памяти. Переменные указателя на матрицу и размеров матрицы должны быть нестатическими членами класса. Обращение к переменным должно осуществляться с использованием указателя this без использования оператора разыменования указателя (->). Вся выделяемая память в программе должна быть освобождена перед выходом.
Я сделал так, но пишет ошибки:
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
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
#include <Windows.H>
 
class Matrix {
private:
int* rows; //пока только строки
 
public:
//Circle () ; недописаный конструктор
void SetRows(int* x) 
{
if ((*x>0)&&(*x<20))  (*this).rows=x;
return;
}
 
int GetRows(void) 
{
return *rows;
}
 
//~Circle () ; недописаный деструктор
};
 
int main()
{
    int* rows=new int;
    
    Matrix t;
 
    t.SetRows(rows);
    cout<<t.GetRows()<<endl;
    return _getch();
}
Помогите исправить.

Добавлено через 38 минут
Вот так получилось. А как массив задать?
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 "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
#include <Windows.H>
 
class Matrix {
private:
int* rows;
int* cols;
 
public:
//Matrix(void) недописанный конструктор
 
void SetRows(int* x) 
{
if ((*x>0)&&(*x<20))  (*this).rows=x;
return;
}
 
int GetRows(void) 
{
return *rows;
}
 
void SetCols(int* y) 
{
if ((*y>0)&&(*y<20))  (*this).cols=y;
return;
}
 
int GetCols(void) 
{
return *cols;
}
 
~Matrix(void) //деструктор
{
delete rows;
delete cols;
}
};
 
int main()
{
    int* rows=new int;
    int* cols=new int;
 
    *rows=5;//установим размер матрицы
    *cols=4;
 
    Matrix t;
 
    t.SetRows(rows);
    t.SetCols(cols);
    cout<<t.GetRows()<<" "<<t.GetCols()<<endl;
    return _getch();
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2009, 22:15
Ответы с готовыми решениями:

GCC Inline Assembly перевести в Visual Studio Inline Assembler
Здравствуйте. Есть код на GCC Inline Assembly и его нужно перевести в Visual Studio Inline Assembler. Не работал с GCC Inline Assembly...

inline assembler в СИ
Доброго! каким образом можно связать внешную переменную и встроенный ассмблер в Си? чтоб было примерно так: int abc = 666; ...

Преобразование кода без указателя в код с использованием указателя
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using...

74
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
23.09.2009, 22:16
Студворк — интернет-сервис помощи студентам
galileopro, Я сейчас готовлю тортик Отпишу тебе через полчаса

Добавлено через 41 минуту
Короче,смотри. Инт занимает 4 байта. Это значит,что i-й элемент массива сдвинут на (i-1)*4 байт от начала (i-1 т.к с нуля нумерация). Я сейчас говорю про эти команды :
C++
1
2
mov eax,[eax][4]
mov eax,[eax][2]
Здесь цифра в скобках - количество байт для смещения(смещаешься начиная с адреса записанного в eax). Ты читаешь во второй строке число,которое начинается с третьего байта массива и заканчивается 6-м. Это половина 0-го элемента массива и половина 1-го.После этого ты смещаешь регистр eax вправо, загоняя половину первого туда,где она должна быть Получается первый элемент. Правда,если он очень большой ничего не выйдет ) Хотя,подожди,может,ты на самом деле получаешь второй.Поскольку двойные слова хранятся в перевернутом виде. Да,это вероятно.Короче,не суть важно,главное,что это - не то

Когда я говорил про умножение на четыре - я говорил про умножение индексов в скобках. Сейчас ты можешь просто написать вместо [2] [8],но когда будешь делать проход в цикле,тебе нужно будет либо инкрементировать регистр на 4 сразу,либо на 1 а потом запихивать в какойнить другой и умножать на 4. Примерно так. Сам EAX умножать и сдвигать не надо - ты уже считал туда какое-то значение,это не каретка которая туда-сюда ездит
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
23.09.2009, 22:31  [ТС]
А в eax можно засунуть только 2 байта?
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
23.09.2009, 22:34
Цитата Сообщение от galileopro Посмотреть сообщение
А в eax можно засунуть только 2 байта?
Четыре! EAX это 4 байта, и int не с проста равен по размеру EAX. Просто нужно засунуть нужные четыре байта,а у тебя запихиваются не те,хотя и примерно из нужного места

Кстати,все,что я говорю,актуально для 32-битных платформ. С 64битными что-то по-другому,но что я не знаю,т.к студия даже инлайн ассемблер для них не поймет.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
23.09.2009, 22:40  [ТС]
Тогда вот этот код должен запихивать в eax первый элемент массива?
Assembler
1
2
3
4
5
6
mov ebx, this
xor eax, eax ;быстрый способ очистки регистра ax 
mov eax,[ebx].MyMatrix 
mov eax,[eax][0]
mov edx, [ebx].MyVector[0]
mov [edx][0], eax
Добавлено через 23 секунды
4 байта с 0 по 4?
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
23.09.2009, 22:44
Да! Тебе придется повозиться когда будешь делать цикл,но что поделать.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
23.09.2009, 22:47  [ТС]
Да не в этом дело. Вот смотри, такой код выводит на экран 34356... не помню, но большое число, хотя у меня все элементы массива нулевые.
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
void InputRandomMatrix(void)
{
for(int i=0;i<rows;i++)
    for(int j=0;j<cols;j++) 
        MyMatrix[i][j]=0;
}
 
void Calculate(void)
{
__asm   
{
mov ebx, this
xor eax, eax ;быстрый способ очистки регистра ax  
mov eax,[ebx].MyMatrix[0]
mov edx, [ebx].MyVector[0]
mov [edx][0], eax  
}
return;
}
...
};
 
int main()
{   
    Matrix t;
    t.InputRandomMatrix();
    t.Calculate();
    cout<<(int)t.GetVector(0)<<endl;
    return _getch();
}
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
23.09.2009, 22:48
А,нет.Зачем ты убрал один из мувов
C++
1
2
mov eax,[eax][4]
mov eax,[eax][0]
вот так должно быть,Если это матрица.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
23.09.2009, 22:50  [ТС]
Выводит 3433272

Добавлено через 2 минуты
Assembler
1
2
3
4
5
6
mov ebx, this
xor eax, eax  
mov eax,[ebx].MyMatrix[0]
mov eax,[eax][0]
mov edx, [ebx].MyVector[0]
mov [edx][0], eax
Выводит тоже 3433272
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
23.09.2009, 22:52
C++
1
2
3
4
5
6
7
mov ebx, this
xor eax, eax ;быстрый способ очистки регистра ax 
mov eax,[ebx].MyMatrix 
mov eax,[eax][0]
mov eax,[eax][4]
mov edx, [ebx].MyVector[0]
mov [edx][0], eax
Заполнил матрицу по индексу в строке (1...n), все работает

Добавлено через 27 секунд
galileopro, у тебя матрица. Там два индекса,ты применил только один.Ты выводишь адрес нулевой строки этим кодом.

Добавлено через 33 секунды
В общем,чтобы понять,перерисуй картинку которую я раньше постил и пойми,что к чему и при чем здесь эти команды (mov eax,[eax][0]).Разберись, почему их две очень похожих.
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
23.09.2009, 22:54  [ТС]
Я писал
Цитата Сообщение от galileopro Посмотреть сообщение
mov eax,[ebx].MyMatrix[0]
так как любой массив должен располагаться в памяти цельным куском, то- есть элементы следуют один за другим, а не каждая строчка отдельным куском, поэтому безразлично, писать
Assembler
1
2
mov eax,[ebx].MyMatrix[0]
mov eax,[eax][0]
Или так, как в первом случае, все равно попаду в первый элемент
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
23.09.2009, 22:56
А ты посмотри,как создается у тебя матрица.Матрица состоит аж из n массивов,по строке на массив. Первый мув - ты выбираешь нужную строку. Второй мув - в строке,как в массиве, выбираешь нужный элемент. Сама переменнная MyMatrix указывает на массив указателей из n штук. Ты кидаешь нужный указатель в eax,а потом уже смещаешься внутри этого массива.Посмотри картинку
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
23.09.2009, 22:57  [ТС]
Опа понял. Вот это работает нормально, это действительно 1 элемент
Assembler
1
2
3
mov eax,[ebx].MyMatrix
mov eax,[eax][0]
mov eax,[eax][0]
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
23.09.2009, 22:58


Разобрались,кажется
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
23.09.2009, 23:01  [ТС]
Слушай, а что засунется в eax таким кодом
Assembler
1
mov eax,[ebx].MyMatrix[0]
указатель на матрицу?
А тогда таким
Assembler
1
mov eax,[ebx].MyMatrix[4]
Это уже не указатель, так как он 4 байта весит.
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
23.09.2009, 23:05
galileopro, Указатель и весит четыре байта.Попробуй sizeof(int* ) :-) Именно в честь 32х битной адресации платформа называется 32битной Именно потому адресуется 4гига оперативки,это ведь 2^32

Добавлено через 58 секунд
P.S не ориентируйся на урезанный (по современным меркам,конечно ) ассемблер с 2^20 адресуемых байт, в котором многих гоняли на занятиях. Тут все по-другому, защищенный режим памяти
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
23.09.2009, 23:07  [ТС]
There are 10 types of people:Those,who understand binary and those,who dont. - жжет. Причем многие мои знакомые(хотя вроде компьютер не только один раз видели) этой шутки не монимают)
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
23.09.2009, 23:09
galileopro, Давай только не будем оффтопить.Мне не положено )) У нас полезная тема получилась. Как доделаешь, выкладывай готовый код,я его в первый пост подкреплю. Ну и если что обращайся,конечно
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
23.09.2009, 23:14  [ТС]
Я все понимаю, но мне очччень хочется узнать: ТО число которое помещается в eax кодом
Assembler
1
mov eax,[ebx].MyMatrix[0]
это ЧТО такое? Нам препод прогу показывал, там такое было написано, я эту прогу мельком видел и сразу бросилось в глаза - <<зачем>> эта операция нужна? Что она в регистр поместит?

Добавлено через 3 минуты

Не по теме:

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

0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
23.09.2009, 23:17
[ebx].MyMatrix(то же,что this->MyMatrix в С++ ) - это указатель на массив указателей,каждый из которых в свою очередь указывает на нужную строку Помещая MyMatrix[0],MyMatrix[4] и т д ты помещаешь указатель на нужный массив в eax. Потом делаешь ту же операцию с eax, разыменовывая тем самым еще один указатель. Т.е в С++ ты пишешь MyMatrix[i][j] - операций разыменования две. Вот и в ассемблере их две.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
24.09.2009, 00:16  [ТС]
Вот написал код, он должен суммировать все элементы матрицы, но он выводит 20278....
Где может быть ошибка?
Assembler
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
void Calculate(void)
{
__asm   
{
mov ebx, this
xor eax, eax 
mov esi, [ebx].rows
shl esi, 2
 
label1:
mov ecx, [ebx].cols
shl ecx, 2
 
label2:
mov eax,[ebx].MyMatrix
mov eax,[eax][ecx]
mov eax,[eax][esi]
mov edx, [ebx].MyVector[0]
add [edx][0], eax //добавляем
sub ecx, 4 //переходим к следующему столбцу
cmp ecx, 0
ja label2
 
sub esi, 4 //переходим к следующей строке
cmp esi, 0 
ja label1 
}
Добавлено через 15 минут
Вот переделал, вроде пока ошибок не видел, но выводит бред(
Assembler
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
__asm   
{
mov ebx, this
xor eax, eax 
mov esi, [ebx].cols
shl esi, 2
 
label1:
mov ecx, [ebx].rows
shl ecx, 2
 
label2: 
mov edx,[ebx].MyMatrix
mov edx,[edx][esi]
mov edx,[edx][ecx]
add eax, edx
sub ecx, 4 //переходим к следующей строке
cmp ecx, 0
ja label2
 
sub esi, 4 //переходим к следующему столбцу
cmp esi, 0 
ja label1 
 
mov ecx, [ebx].MyVector
mov [ecx][0], eax //добавляем
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2009, 00:16

Inline assembler mingw
Добрый вечер ув. пользователи форума. Возникла проблема с ассемблером, и его реализацией в mingw. Имеется функция void call_hook ( void...

Inline Assembler & C++
int main(int argc, char *argv) { perevod(); cout&lt;&lt;&quot;Type Esc to Escape \n&quot;; __asm { mov ah,01h ...

написать программу движущийся графический объект с двумя способоми с использованием статического объекта и с использованием динамического объекта
Движение закрашенного прямоугольника по треугольному контуру с изменением цвета при изменении направления движения.

inline assembler VS чтение по указателю
Доброе время суток. Задача состоит в чтении 1 байта по адресу указателя. Проблема с пониманием, что не так с типами операндов. char...

Как исправить код? / Inline assembler
#include &lt;stdio.h&gt; int main(int argc, char** argv ) { int aa; int bb; aa = 42; bb = 10;


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru