|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|||||||||||
Обращение к переменным объекта с использованием указателя this из inline assembler21.09.2009, 22:15. Показов 7456. Ответов 74
Метки нет (Все метки)
Мне нужно написать класс на С++ с учетом возможности ввода количества столбцов и строк матрицы. Матрица должна размещаться в динамической памяти. Переменные указателя на матрицу и размеров матрицы должны быть нестатическими членами класса. Обращение к переменным должно осуществляться с использованием указателя this без использования оператора разыменования указателя (->). Вся выделяемая память в программе должна быть освобождена перед выходом.
Я сделал так, но пишет ошибки:
Добавлено через 38 минут Вот так получилось. А как массив задать?
0
|
|||||||||||
| 21.09.2009, 22:15 | |
|
Ответы с готовыми решениями:
74
GCC Inline Assembly перевести в Visual Studio Inline Assembler inline assembler в СИ Преобразование кода без указателя в код с использованием указателя |
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|
| 22.09.2009, 19:31 | |
|
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 [ТС] | ||||||
|
Я попробовал "в лоб"
0
|
||||||
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|
| 22.09.2009, 19:42 | |
|
У тебя там бесконечный цикл похоже.
1
|
|
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||||||
| 22.09.2009, 19:48 [ТС] | ||||||
|
Вот еще упростил.
loop lp2 уменьшает постепенно регистр ecx, пока он не станет 0 dec esi //переходим к следующему столбцу - тоже вічитает, пока не занулится.
0
|
||||||
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|||||||||||
| 22.09.2009, 19:53 | |||||||||||
![]() Зато если сделать через this, как с MyMatrix
Я поправил,он вылетает с ошибкой,но хоть не циклится
1
|
|||||||||||
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|||||||||||
| 22.09.2009, 20:03 [ТС] | |||||||||||
|
Вот так переписал
0
|
|||||||||||
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
||||||
| 22.09.2009, 20:14 | ||||||
|
galileopro, причина такая.
mov [eax][смещение],что-то там.eax для примера,можно любой общего назначения. Причем адресовать сразу по ячейке памяти нельзя. Вот как это выглядит.Прошу прощения за убогость художества,но в пейнте красивее не сделаешь Но суть оно отражает. Другими словами еще раз - тебе нужно адресовать по ячейке памяти,там лежит адрес массива,который тебе выдал new когда ты создавал его. [ebx].MyVector[0] просто берет адрес этой ячейки и добавляет 0. А нужно взять тот адрес,который внутри записан и добавить к нему ноль. Вот разница.
1
|
||||||
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||||||
| 22.09.2009, 20:26 [ТС] | ||||||
|
Примерно так?
0
|
||||||
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
||||||
| 22.09.2009, 20:32 | ||||||
|
galileopro, ты там регистры кажется перепутал. Но в общем я понял,что ты понял
![]() MyVector можно без индекса. В ассемблере индекс не делает разименование, еще одна формулировка предыдущего поста. Т.е в си применяя к указателю в памяти [] ты попадаешь на массив,а в асме - просто смещаешься куда-то дальше
0
|
||||||
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||||||
| 22.09.2009, 20:39 [ТС] | ||||||
|
Ясно. А почему
Эта операция
eax = 3435973632 если ecx=5 при этом?
0
|
||||||
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
||||||
| 22.09.2009, 20:45 | ||||||
|
galileopro, та же причина. Более того,тебе придется несколько раз обновлять регистр с указателем. В классе матрица представлена одним единственным указателем - он указывает на массив из указателей(вне класса,в динамической памяти), а они каждый на свой "вектор"(см. схему (= ). Чтобы добраться до значения тебе нужно :
1
|
||||||
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|||||||||||
| 22.09.2009, 20:58 [ТС] | |||||||||||
|
Все значения должны быть от 0 до 20 где-то
Добавлено через 7 минут Спасибо я понял. Вот переделал, но он вілетает.(
0
|
|||||||||||
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|
| 22.09.2009, 21:02 | |
|
galileopro, забыл умножить ecx на 4.Асм за размером не следит,он с байтами работает. Т.е читается какой-то левый указатель из,скажем, трех байт одного и одного байта следующего за ним
К тому же, если ecx == cols, то мы вылезем за границу,т.к массивы нумеруются с нуля.Добавлено через 26 секунд Я отойду минут на сорок.
1
|
|
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
|||||||||||
| 22.09.2009, 21:24 [ТС] | |||||||||||
|
Вот слава Богу заработало
0
|
|||||||||||
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|
| 22.09.2009, 21:53 | |
|
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 [ТС] | |||||||||||
|
Легко сказать умножай все на 4. Для єтого надо сначала засунуть множитель в eax, затем умножить, потом опять поместить в исходный регистр и восстановить eax. Это жуткий гемор.
Хотя можно
Добавлено через 2 минуты
0
|
|||||||||||
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|
| 22.09.2009, 22:16 | |
|
galileopro, нужно влево сдвигать,вроде shl
1
|
|
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||||||||||||||||
| 22.09.2009, 22:37 [ТС] | ||||||||||||||||
|
К сожалению
Работает нормально только
0
|
||||||||||||||||
|
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
|
|||||||||||
| 22.09.2009, 22:58 | |||||||||||
А сдвигом вправо eax перед тем как его занести ты делишь то,что прочитал на 2^16 и получаешь чето маленькое,чего и хотел,но это вообще левая цифра. Я говорил про эту строку
1
|
|||||||||||
|
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
|
||||||||||||
| 23.09.2009, 21:24 [ТС] | ||||||||||||
Я что-то никак не пойму, что там на 4 умножать? Он после такого вылетает
0
|
||||||||||||
| 23.09.2009, 21:24 | |
|
Inline assembler mingw Inline Assembler & C++ написать программу движущийся графический объект с двумя способоми с использованием статического объекта и с использованием динамического объекта inline assembler VS чтение по указателю Как исправить код? / Inline assembler Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача
Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
Сигнатура
func Fetch(urls string, maxConcurrent int) Result
Пример
urls :=. . .
|
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition)
Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
|
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
|
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool
Worker Pool — паттерн конкурентной обработки задач в Go.
Суть: фиксированное количество горутин-воркеров читают задачи из общего канала
и пишут результаты в общий канал результатов. . . .
|
|
[golang] Pipeline
alhaos 08.06.2026
Pipeline
Pipeline — паттерн конкурентной обработки данных в Go.
Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
|
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь
lIs4oanZS9Y
|
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу.
До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
|
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений.
. . .
|