|
E=m*c^2
|
|
MASM Использование 32-разрядных инструкций push/pop в режиме x6402.04.2020, 14:55. Показов 9680. Ответов 46
Доброго времени!
Существует ли способ написать в тексте ассемблера команду в машинных кодах? я хочу вставить в текст masm64 32-битные команды. я смотрю через дебагер и вижу что компилятор спокойно использует 32-битные и даже 16-битные команды там где считает это нужным, тоесть принципиального запрета на это нет, но он несогласен использовать 32-битные команды JMP r32/ POP r32 / PUSH r32. я хотел бы вставить нужные мне команды в текст напрямую
0
|
|
| 02.04.2020, 14:55 | |
|
Ответы с готовыми решениями:
46
Сделать так чтобы если вводится push выполнялась функция push, если pop то pop
Push, Pop |
|
Эксперт Hardware
|
|||
| 05.04.2020, 08:17 | |||
|
Для согласования данных кэша и ОЗУ, процессор отрабатывает циклы-слежения (snoop-cycle). В этих циклах, происходящих при обращении к ОЗУ внешних абонентов, проц определяет присутствие затребованной ими области, в своём кэше. Если область у него отображается, дальнейшие действия зависят от типа обращения. Если вн.абонент пытается записать что-то в ОЗУ, то процессор уничтожает соответствующую линейку из своего кэша. Если-же вн.абонент читает - то кэш-линейка выгружается в ОЗУ, прежде чем клиент выполнит реальное считывание. Более того, в таких случаях современные процессоры могут вообще не записывать грязные линейки в ОЗУ, а передавать их сразу абонентам - выгрузка в ОЗУ произойдёт позже. и правильно.. он появился сразу с приходом синхронной памяти. я не говорил, что это 1-пин - из контролёра маска выходит 8-битной шиной, по биту на каждый чип (что демонстрирует рисунок битами 7:0):
2
|
|||
|
E=m*c^2
|
||||||||
| 05.04.2020, 18:07 [ТС] | ||||||||
rdi / rbx лежит два значения и один и тот же код обрабатывает два потока данных
0
|
||||||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||||||||||||||
| 06.04.2020, 02:14 | |||||||||||||||
|
Добавлено через 20 минут Другой момент, что читать 8 раз по 1 байту – это гораздо медленнее (даже если данные будут в кэше после прочтения первого байта, а они там будут, если чтение все 8 раз будет происходить в пределах 1 линии кэша), чем 1 раз по 8 байт. Соответственно, 2 раза по 4 байта будет медленнее, чем 1 раз по 8 байт. Программа может (на некоторых процессорах) получить замедление, если данные не будут выравнены по ближайшей (в сторону увеличения) границе степени двойки размера читаемых/записываемых данных. Т.е. для qword - по 8 байтам, для dword - по 4 байтам, tbyte - по 16 байтам и т.д. Особенно, если будет пересечение границы линии кэша. В SSE/AVX есть даже разные инструкции для чтения/записи данных по выравненному адресу и по невыравненному (к примеру, movaps/movups, movdqa/movdqu). Кроме того, особо критически важные в плане скорости исполнения многократно повторяемые блоки кода (функции, циклы) должны быть выравнены по границе 16 байт. Однако выигрыш в скорости от выравнивания в большинстве случаев минимален, поэтому делать так есть смысл только в особо критических случаях. Если написать movnti [x],eax (запись в память, минуя кэш), код выполнится очень быстро, а если:
1
|
|||||||||||||||
|
Эксперт Hardware
|
|||||
| 06.04.2020, 06:45 | |||||
|
А на счёт выгрузки в фоне - вполне возможно. Только реальной записью линеек в память процессор не занимается, а озадачивает этим как-минимум контроллёр шины BIU (Bus-Interface-Unit), который имеет свой FIFO-буфер. Поскольку шина-памяти одна (в двуканальном две), BIU в любом случае будет дожидаться её освобождения. У каждого ядра свой L1, хотя общий - последний в иерархии. Поэтому если соседнее ядро свободно, то выгрузить чужие данные из общего кэша по WB может и оно - тогда получится типа в фоне.
В принципе разницы нет, и вообще не понимаю зачем нужны эти биты-маски. Перед записью, контролёр открывает всю строку банка памяти, и все байты из этой строки сваливаются в буфер Sense-AMP, куда и производится реальная запись данных - в DRAM-матрицу чипов записанные данные попадают уже из Sense-AMP. Одна отрытая строка физ.памяти равна одной странице вирт.памяти, а это мин.4 Кб. Соответственно можно заполнить записью хоть всю открытую страницу, и такой\страничный режим тоже существует - итого их три: страничный, пакетный и обычный.
2
|
|||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
||||
| 06.04.2020, 12:13 | ||||
|
У меня AIDA64 почему-то не показывает политику, а PC-Wizard не работает в 10-ке ![]() Добавлено через 14 минут И второй интересный момент. Запускаю я тест скорости. Обычная память – 17 Гб/с, L1 – 460 Гб/с. Т.е. за один такт читается 4,5 байта из обычной памяти и 124 байта из L1 (при тактовой частоте 3700 МГц). Допустим, что за одну операцию одно ядро читает 32 байта (YMM) и работает 4 ядра, итого 128 байт. Т.о. при чтении из обычной памяти 1 инструкция (причём, параллельно на каждом из 4-х ядер) выполняется примерно за 28 тактов, а при чтении из L1 – за 1. Про L1 понятно, вроде всё логично. Но из обычной памяти должно производиться параллельное чтение сразу нескольких участков памяти, ведь 28 тактов – это на 4 ядра, а на одно 7, т.е. на 100 тактов выполняется ≈ 14-16 операций чтения по 32 байта или по 7-8 операций по 64 байта, т.е. получается, что они должны выполняться параллельно (с упреждением, т.е. спекулятивно, опять же). Но канал памяти же один (ну или два изредка). Или читается сразу, скажем, целая страница (в какой-нибудь L3)? Как это всё работает?
2
|
||||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|||||
| 06.04.2020, 17:15 | |||||
|
Добавлено через 3 минуты Добавлено через 22 минуты Добавлено через 4 минуты Добавлено через 6 минут З.Ы. По моему построение процессора - это набор пребанальнейших идей и когда их понял нет смысла копаться в деталях. Все равно кроме тех-же самых идей ничего выкопано не будет.
2
|
|||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||
| 06.04.2020, 18:49 | |||
![]() Понятно, что не только на этом, но с другой стороны, раз прирост такой маленький, как пишут (30% в лучшем случае, а обычно и того меньше: 5-10-15%), значит всё-таки спекуляция и внеочерёдка более или менее неплохо работают (и тем более, раз по 4 SMT на ядро в юзерских процах не делают). Хотя ещё, наверное, среднестатистический код всё же довольно-таки редко, работая с памятью, попадает в ситуации промахов кэша. В целом, это логично, т.к. бОльшая часть работы с памятью осуществляется либо в стеке, либо в одной и той же области. Но ещё такой малый прирост может быть, если спекулятивно выполненный код выбрасывается за ненадобностью в довольно большом объёме (т.е. процессор много шпарит вхолостую). Я так думаю ©. А вот это, кстати, интересно: какова статистика по этому показателю (сколько спекулятивно выполненного кода улетает в трубу)?
1
|
|||
|
Эксперт Hardware
|
|||||
| 06.04.2020, 22:52 | |||||
|
Шина-адреса у неё-же не 64, а 15-битная и называется МА - мультиплексный адрес. Проц выставляет на шину линейный, а контролёр преобразует его в двумерный DRAM-адрес строка\столбец. Сколько отводится под строку и сколько под столбец, можно узнать из даташита на память: Здесь видно, что под Row выделяется 14-бит, а под столбец 10. Выходит эта матрица состоит из: 16К строк (высота), и 1К столбцов (длина). Это адресация одного банка памяти (1К Page Size per Bank), а всего у DDR3 их 8. Три бита BA[0:2] представляют собой 3-старших бита строки так, что всего реальных строк в матрице получается уже не 16К, а х8=128К. Кол-во столбцов при этом остаётся прежним 1К, и в каждом хранится байт - это и есть "открытая страница" (в данном случае) размером 1-Кбайт. У DDR2 страницы были 4К-байтные, зато строк было меньше.Поскольку строка идёт по всей 10-битной ширине матрицы, то контролёр физически не может открыть её половину - приходится открывать всю, в результате чего отпираются затворы всех ячеек памяти (которые висят на этой строке) и 1К инфы сваливается в буфер Sense-AMP. Только теперь контролёр посылает строб CAS#, и следом адрес столбца. В не зависимости чтение это или запись, по заданному адресу столбца, байты перезаписываются именно в буфере Sense-AMP, а уже позже восстанавливаются на прежнее место в матрицу. У каждого банка свой усилитель SAMP, поэтому контролёры могут держать открытыми сразу несколько страниц с одинаковым адресом, но в разных банках, или-же бегущими огнями чередовать доступ к ним в режиме "Interleaving". Это позволяет параллельно читать одну строку, и регенерировать другую.
1
|
|||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
||||
| 07.04.2020, 10:39 | ||||
|
Замороченная система, конечно. Что скажешь всё-таки про всё вот это безобразие:
1
|
||||
|
Эксперт Hardware
|
||||
| 07.04.2020, 15:05 | ||||
|
Инженерам нужно было придумать или две отдельные системы на запись и чтение, или-же сделать одну универсальную. Если с записью в DRAM-матрицу всё прозрачно, то чтение деструктивно по своей природе, т.к. при этом накопительные кондёры всей строки (страницы) разряжаются. Поэтому она и сбрасывается в усилитель-буфер Sense-AMP, чтобы сохранить информацию во-всей строке. Если имеются другие варианты, то думаю инженеры были-бы рады их услышать.
2
|
||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||
| 07.04.2020, 15:50 | |||
mov [eax],edx. В кэше строки из [eax] нет. Будет ли процессор ждать, когда произойдёт чтение-модификация-запись или перейдёт сразу к следующей инструкции (т.к. получать в ответ ничего не нужно).
1
|
|||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
||
| 07.04.2020, 17:30 | ||
|
0
|
||
|
Эксперт Hardware
|
|||
| 07.04.2020, 17:32 | |||
I.L1, а данные в D.Ll. EIP вообще плетётся в хвосте, пока инструкции выполняются беспорядочно.Когда программа только запускается, она имеет право 1-раз пробуксовать пару сек, в течении которых (по-мимо прочего) заполняются и кэш-линейки. В это время процессор может загребсти сразу всю открытую страницу из DRAM в свой кэш, а потом проанализировав, выставить флаг "Valid" только актуальным линейкам - остальные будут замещаться по-ходу пьессы. Когда-то я собирал инфу по кэшам здесь - можно глянуть на досуге. В пакетном режиме, проц сначала засылает адрес-строки, и за ним.. выровненный на 64-байт границу адрес первого столбца кэш-строки. После того-как первые 8-байт лягут в SAMP, контроллёр включает пакетный счётчик-повторов BL=8, и дальше авто\увеличивается только адрес-столбца внутри открыто\удерживаемой страницы. То-есть за одну транзакацию на шине, адрес строки засылается только 1-раз, поэтому на одном канале невозможно прочитать одновременно несколько строк с разными адресами. Если-же контроллёр 2-канальный - то без проблем, т.к. у него своя шина адреса\данных. Как-то так..
0
|
|||
| 07.04.2020, 17:49 | |
|
Не по теме: Да нормально. Много чего интересного узнали.
0
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||||||
| 07.04.2020, 19:15 | |||||||
|
Ну давай рассмотрим ситуацию, когда мы последовательно (или рендомно или ещё как-то) пишем 1 Гб памяти. Процессор при всём желании не сможет успеть заранее прочитывать всю память, инструкции всё равно будут выполняться быстрее. Или даже ещё проще. Пример из Optimizing subroutines in assembly language (by A.Fog):
mov esi будет вытеснять сохранённую линию по адресу [edi] (т.к. все 5 mov'ов работают с одним и тем же, скажем, так, ключом, а полос всего 4). Далее, на втором круге, mov ebx вытеснит [edi + 0800h] и т.д. по кругу. Не будем брать во внимание тот факт, что далее идёт работа с L2, т.к. L2 всё равно меньше размером.Ну не может быть такого, чтобы кэш был ВСЕГДА заполнен заранее. Иначе можно было бы не думать о кэше вообще. Посему и вопрос: будет ли тут ожидание чтения-модификации-записи или нет? Если нет, значит это всё пишется либо в какой-то иной буфер, либо в L1 (если все ячейки НЕ-dirty, то сразу, а если все dirty, значит ждём записи и потом пишем, а как иначе?) Если да, то почему movnt* работает быстро, а не сотню таков (ожидая, когда завершится запись).
0
|
|||||||
|
E=m*c^2
|
|||||||
| 07.04.2020, 20:00 [ТС] | |||||||
|
кратко: у меня есть код где я перевожу указатель стека на данные размещенные в сегменте кода. вызовет ли это замедление при работе? это не рабочий код исключительно для иллюстрации вопроса:
0
|
|||||||
|
Эксперт Hardware
|
||||
| 07.04.2020, 20:16 | ||||
|
что в этом случае кэш будет проседать. работа тандема кэшей всех ядер вообще покрыта тайной, и внятных доков по ней трудной найти. Добавлено через 6 минут Кстати Крис рекомендовал сей финт ещё давно, как быстрый доступ к стеку.
0
|
||||
|
E=m*c^2
|
|
| 07.04.2020, 20:27 [ТС] | |
|
я беспокоюсь не будет ли обращение к стеку за данными "срывать" загрузку инструкций. ведь я так думаю кешь кода может выдавать только одну порцию данных за такт. то есть после декодирования
ret когда проц установит необходимость в загрузке данных он прервет процесс загрузки кода до момента получения данных.Добавлено через 1 минуту различаются ли физически кеши данных и кода? может кешь кода физически расположенны ближе к "входу" в проц чтобы обеспечить выдачу команд "такт в такт"
0
|
|
|
E=m*c^2
|
|
| 07.04.2020, 20:30 [ТС] | |
|
0
|
|
| 07.04.2020, 20:30 | |
|
push и pop Функции pop и push Работа с push/pop в стеке Верна ли реализация push/pop? PUSH/POP vs MOV из памяти Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302
Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
|