Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|||||||||||
1 | |||||||||||
Обращение к переменным объекта с использованием указателя this из inline assembler21.09.2009, 22:15. Показов 6660. Ответов 74
Метки нет (Все метки)
Мне нужно написать класс на С++ с учетом возможности ввода количества столбцов и строк матрицы. Матрица должна размещаться в динамической памяти. Переменные указателя на матрицу и размеров матрицы должны быть нестатическими членами класса. Обращение к переменным должно осуществляться с использованием указателя this без использования оператора разыменования указателя (->). Вся выделяемая память в программе должна быть освобождена перед выходом.
Я сделал так, но пишет ошибки:
Добавлено через 38 минут Вот так получилось. А как массив задать?
0
|
21.09.2009, 22:15 | |
Ответы с готовыми решениями:
74
GCC Inline Assembly перевести в Visual Studio Inline Assembler inline assembler в СИ Преобразование кода без указателя в код с использованием указателя Inline assembler mingw |
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|
22.09.2009, 19:31 | 21 |
galileopro, push надо сделать один раз вне цикла. У тебя метка выше и он на каждом проходе делает push. Нужно или вынести из цикла, т.е сделать push до метки lp2, или где-то в цикле делать pop,только это вроде нафиг не надо.
Добавлено через 8 минут Да,по поводу не той ячейки - мы не учли,размер инта, нужно умножить содержимое ecx на 4( или сдвинуть влево на 2..). И для esi то же самое верно.Ща мануал посмотрю))
1
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||||||
22.09.2009, 19:36 [ТС] | 22 | |||||
Я попробовал "в лоб"
0
|
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|
22.09.2009, 19:42 | 23 |
У тебя там бесконечный цикл похоже.
1
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||||||
22.09.2009, 19:48 [ТС] | 24 | |||||
Вот еще упростил.
loop lp2 уменьшает постепенно регистр ecx, пока он не станет 0 dec esi //переходим к следующему столбцу - тоже вічитает, пока не занулится.
0
|
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|||||||||||
22.09.2009, 19:53 | 25 | ||||||||||
Зато если сделать через this, как с MyMatrix
Я поправил,он вылетает с ошибкой,но хоть не циклится
1
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|||||||||||
22.09.2009, 20:03 [ТС] | 26 | ||||||||||
Вот так переписал
0
|
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
||||||
22.09.2009, 20:14 | 27 | |||||
galileopro, причина такая.
mov [eax][смещение],что-то там.eax для примера,можно любой общего назначения. Причем адресовать сразу по ячейке памяти нельзя. Вот как это выглядит.Прошу прощения за убогость художества,но в пейнте красивее не сделаешь Но суть оно отражает. Другими словами еще раз - тебе нужно адресовать по ячейке памяти,там лежит адрес массива,который тебе выдал new когда ты создавал его. [ebx].MyVector[0] просто берет адрес этой ячейки и добавляет 0. А нужно взять тот адрес,который внутри записан и добавить к нему ноль. Вот разница.
1
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||||||
22.09.2009, 20:26 [ТС] | 28 | |||||
Примерно так?
0
|
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
||||||
22.09.2009, 20:32 | 29 | |||||
galileopro, ты там регистры кажется перепутал. Но в общем я понял,что ты понял
MyVector можно без индекса. В ассемблере индекс не делает разименование, еще одна формулировка предыдущего поста. Т.е в си применяя к указателю в памяти [] ты попадаешь на массив,а в асме - просто смещаешься куда-то дальше
0
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||||||
22.09.2009, 20:39 [ТС] | 30 | |||||
Ясно. А почему
Эта операция
eax = 3435973632 если ecx=5 при этом?
0
|
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
||||||
22.09.2009, 20:45 | 31 | |||||
galileopro, та же причина. Более того,тебе придется несколько раз обновлять регистр с указателем. В классе матрица представлена одним единственным указателем - он указывает на массив из указателей(вне класса,в динамической памяти), а они каждый на свой "вектор"(см. схему (= ). Чтобы добраться до значения тебе нужно :
1
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|||||||||||
22.09.2009, 20:58 [ТС] | 32 | ||||||||||
Все значения должны быть от 0 до 20 где-то
Добавлено через 7 минут Спасибо я понял. Вот переделал, но он вілетает.(
0
|
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|
22.09.2009, 21:02 | 33 |
galileopro, забыл умножить ecx на 4.Асм за размером не следит,он с байтами работает. Т.е читается какой-то левый указатель из,скажем, трех байт одного и одного байта следующего за ним К тому же, если ecx == cols, то мы вылезем за границу,т.к массивы нумеруются с нуля.
Добавлено через 26 секунд Я отойду минут на сорок.
1
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|||||||||||
22.09.2009, 21:24 [ТС] | 34 | ||||||||||
Вот слава Богу заработало
0
|
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|
22.09.2009, 21:53 | 35 |
mov eax,[eax][2] - это середина ячейки из 4-х байт.Умножай все индексы на 4 >_<
Добавлено через 1 минуту И у тебя очистка памяти неправильная delete MyMatrix; Нужно сначала удалить каждую строку матрицы, сколько раз вызвал new столько же раз вызывай delete. т.е циклом сначала все строки, MyMatrix[i],а потом саму MyMatrix
1
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|||||||||||
22.09.2009, 22:01 [ТС] | 36 | ||||||||||
Легко сказать умножай все на 4. Для єтого надо сначала засунуть множитель в eax, затем умножить, потом опять поместить в исходный регистр и восстановить eax. Это жуткий гемор.
Хотя можно
Добавлено через 2 минуты
0
|
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|
22.09.2009, 22:16 | 37 |
galileopro, нужно влево сдвигать,вроде shl
1
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||||||||||||||||
22.09.2009, 22:37 [ТС] | 38 | |||||||||||||||
К сожалению
Работает нормально только
0
|
2255 / 770 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|||||||||||
22.09.2009, 22:58 | 39 | ||||||||||
А сдвигом вправо eax перед тем как его занести ты делишь то,что прочитал на 2^16 и получаешь чето маленькое,чего и хотел,но это вообще левая цифра. Я говорил про эту строку
1
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|||||||||||
23.09.2009, 21:24 [ТС] | 40 | ||||||||||
Нет. Это не левая цифра. Попробуй этот код
Я что-то никак не пойму, что там на 4 умножать? Он после такого вылетает
0
|
23.09.2009, 21:24 | |
23.09.2009, 21:24 | |
Помогаю со студенческими работами здесь
40
Inline Assembler & C++ написать программу движущийся графический объект с двумя способоми с использованием статического объекта и с использованием динамического объекта inline assembler VS чтение по указателю Как исправить код? / Inline assembler Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |