|
Asm/C++/Delphi/Py/PHP/VBA
|
||
Что есть "макрос"? (разделение темы "Можно ли FASM сделать высокоуровневым?")02.08.2017, 00:13. Показов 3893. Ответов 15
Метки нет (Все метки)
1
|
||
| 02.08.2017, 00:13 | |
|
Ответы с готовыми решениями:
15
Можно ли FASM сделать высокоуровневым? Fasm 1.69.39 что нового. И как сделать макрос без запятых типа IF eax => 10 Продолжение темы с файлом, как можно сделать так что если нет фала |
|
0 / 0 / 0
Регистрация: 22.02.2016
Сообщений: 27
|
||
| 02.08.2017, 11:27 | ||
|
На сегодняшний день практически все виды кода - текстовые, а то, что макросы обрабатываются предпроцессором еще не определяет их суть. Макрос - это небольшой стандартный набор команд для выполнения рутинной задачи, по сути - некоторая универсальная подпрограмма. Ну, если грубо, то это выглядит так: Допустим, процессор не имеет встроенной аппаратной поддержки для умножения двух чисел, а потому реализация умножения на нем будет представлять собой серию сложений и сдвигов, меняющихся поочередно. Допустим, нам нужно умножить в начале программы 2*3, а в конце 5*7. Мы пишем два отдельных кода: ............ a := 10 b := 10 << 1 c := a + b ............ и второй ............ a := 100 b := 100 << 1 c := a + b b := b << 1 c := c + b b := b << 1 c := c + b b := b << 1 c := c + b b := b << 1 c := c + b b := b << 1 c := c + b ................ И каждый раз, когда нам нужно что-то умножить, нужно повторять эту чехарду столько раз, сколько единиц в множителе. Выход из этой ситуации прост - пишем универсальную подпрограмму (макрос), в которой вставляем неопределенный цикл и стандартный набор сдвигов и сложений: .............. in z (число единиц в множителе) in x (умножаемое) a := x b := x << 1 c := a + b for i = 0 to i = z b := b << 1 c := c + b end for out c ....... Все, наша универсальная подпрограмма готова, теперь в нее можно загружать любые два числа и она их перемножит путем многоразового чередования сложений и сдвигов. Как можно видеть, мы НЕ увеличиваем код, а СОКРАЩАЕМ - вместо тысяч строк кода при попытке перемножить два числа, одно из которых находится в районе десятичной тысячи, мы имеем код в десяток-другой строк на ассемблере, который с одинаковой легкостью перемножить хоть тысячи, хоть миллионы, хоть миллиарды. И это я еще не говорю о том, что показанный выше код мы получим на выходе ассемблерного предпроцесса, а сам код будет выглядеть еще проще, ибо там весь набор вышеизложенных команд будет заменен всего на одну строку: ........ run macros umnoj (z,x) ........ Вообще одна строка вместо тысяч. По сути, именно это и является предметом всех известных базовых библиотек на языках программирования - универсальные подпрограммы, которые заменяют многокомандные рутинные операции. Просто в ЯВУ есть специальные методы их подключения и соответствующие им команды вроде #include, а в fasm-е они заменены макросами, которые по сути выполняют функцию того же #define. В общем - не туда я советоваться пришел... ![]() Ну да ладно, решение все-равно уже принято, чему быть - того не миновать.
0
|
||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|||||||||||||||||
| 02.08.2017, 13:42 [ТС] | |||||||||||||||||
|
Т.е. этот run macros umnoj (z,x) превратится в
А второе – перед тем, как run macros umnoj (z,x) превратится в этот код препроцессор должен будет пройтись по определению этого макроса и сгенерировать такой код (т.е. он должен будет обработать и отбросить все ненужные if-ы, выполнить все циклы for, while и т.д.).Для иллюстрации. fasm скомпилировал код
fasmg (в котором mov описан макросом, а не встроен в компилятор) на код
Пришлось уменьшать счётчик в 10 раз (до 100000), результат был готов через 12 секунд!!! Разница в скорости в 170 раз! Вот и весь разговор про макросы...
1
|
|||||||||||||||||
|
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
|
||||||||||||||
| 02.08.2017, 14:14 | ||||||||||||||
![]() Похоже Вы не представляете, что такое макрос в ассемблере.
Если умножать 5Х7= 000101 001010 010100 ===== 100011=35 но если делать 7Х5, получается 000111 001110 ===== 010101=21 ![]() Вот код, под фасм, который реализует правильный алгоритм умножения, сложением:
0
|
||||||||||||||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
||
| 02.08.2017, 15:33 | ||
|
1
|
||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
||
| 02.08.2017, 16:04 | ||
|
1
|
||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
||
| 02.08.2017, 16:08 | ||
|
mul a, b то макроподстановка раскрывает эту строчку до push a push b call _mul_ и вызываемая здесь универсальная подпрограмма _mul_: код умножения столбиком ret производит умножение a на b Добавлено через 17 минут В макроподстановку можно добавить условную трансляцию и в случае если один из операндов константа и степень двойки раскрывать макрос не вызовом подпрограммы, а прямой вставкой в код сдвигов влево. Но это уже косметические улучшения.
0
|
||
|
0 / 0 / 0
Регистрация: 22.02.2016
Сообщений: 27
|
||||||||
| 03.08.2017, 00:13 | ||||||||
![]() Мне нужно было именно Вашими словами написать, чтобы это стало для Вас понятно? Нет там никакой ошибки, просто я не включал туда код, который бы определял единицы и добавлял соответствующие смещения, я просто налепил простенький псевдокод от фанаря, ради того, чтобы показать суть дела - ничего больше. Именно по этой причине я не стал заморачиваться и писать ассемблерный код, а написал на псевдо-коде.Есть три явления в природе: Профессионал, который знает суть вещей и понимает, как они работают, а потому может эффективно решать задачи, манипулируя предметом профессии. Специалист, который ничего не понимает в происходящем, но который заучивает стандартные манипуляции и наборы операций, а потому в неизменных условиях может решать поставленные задачи. Халтурщик, не только не понимающий сути вещей, но и не владеющий темой вообще, не умеющий ничего делать ни на каком уровне, но зато имеющий диплом и полтора года непонятного пребывания на непонятных должностях. Так вот - первых в любой профессии единицы. Вторых - несколько процентов, а вот третьих - это все остальные. Когда сталкиваешься с таковыми и данные господа начинают "объяснять" вещи, которых не понимают вообще, то пред ними лучше срывать покровы максимально простым и доступным для их неокрепшего сознания образом. Если Вы опытный программист, то не мне, а господам, отвечавшим мне, напишите что к чему с макросами и с чем их едят, может чему и научатся полезному, а то Вы себе не ту цель выбираете.
0
|
||||||||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|||||||||||||||
| 03.08.2017, 02:06 | |||||||||||||||
|
Подпрограмма и текстовая подстановка - это куплеты из разных песен. Подпрограмма это кусок кода, который многократно вызывается из разных мест программы. Подпрограмма вызывается назначенной на то инструкцией процессора и завершается назначенной на то инструкцией. То есть подпрограмма - это код. А макроподстановка - это изменение исходного текста программы. И это изменение может делаться с совершенно разными целями. Макроподстановка может вообще кода не порождать, например, если некоторое условие не выполнилось. Макроподстановка может порождать вставку кода, который никоим образом не является подпрограммой и который суть inline-вставка. Макроподстановка может порождать данные, а не код. Наконец макроподстановка может просто изменять синтаксис ассемблера и не влиять на порождение кода. Я часто использую макроподстановки, чтобы сэмулировать на ПК исполнение фрагментов исходника на ассемблере совершенно другой архитектуры. При этом макроподстановки по сути исполняют кросс-трансляцию исходника одной архитектуры в исходник для другой. То есть все чего можно добиться изменением исходного текста путем подстановок, то и можно делать макросами. Только подпрограммы-то тут причем ? Добавлено через 15 минут Вот примеры использования макроподстановок из одной моей версии Форта :
т.е. односвязный список записей с именами сущностей Форта и указателями. Использую я эти макросы в тексте программы вот так
имен. Причем список имен создается не там где ассемблируется код, а в хвосте программы. Для этого в макросе текущая позиция трансляции перекидывается туда-сюда с помощью ORG. В итоге код COM-программы наращивается начиная от смещения 100h и растет вверх, а список имен наращивается начиная со смещения 8000h и растет вниз. Это пример использования макросов на всю катушку их возможностей. Ими я заставляют TASM делать то, что он не умеет. Он не умеет ассемблировать по адресам сверху вниз, а я его заставляю. Мне нужно, чтобы он не просто скомпилировал программу, а породил двоичный образ для загрузки в память со специальной структурой. И я его заставляю. Но вот каким образом вот все это можно обозвать подпрограммами ? Да никаким ! Добавлено через 27 минут З.Ы. Но кажется я догадываюсь. Вот, к примеру, в сетевой игрушке World of Warcraft макрос на снятие дебаффов паладином выглядит так /cast Божественный щит /cancelaura Божественный щит И у меня такое подозрение, что говоря об ассемблере, Вы используете понятие макрос в том смысле, в каком он используется в этой игрушке, а вовсе не в ассемблере. В Вов-ке ведь действительно макросы можно понять как "подпрограммы текстового кода". Добавлено через 35 минут З.З.Ы Короче говоря понял. Вы используете понятие макрос так, как будь-то ничего кроме интерпретаторов не видели. Поэтому у Вас "код текстовый", "макрос = подпрограмма в виде куска текста для исполнения интерпретатором". Но АССЕМБРЕР НЕ ЕСТЬ ИНТЕРПРЕТАТОР ! Он компилятор ! Он имеет на входе исходный текст, а на выход выдает двоичный код. А макросы выполняют текстовые подстановки даже не на входе, а еще до входа. Т.е. это те-же текстовые подстановки, что и у интерпретатора, да только того смысла, что у интерпретатора они не имеют. Добавлено через 7 минут Для TC код, это то, что для JinX исходник. А того, что для JinX код, для ТС просто не существует.
0
|
|||||||||||||||
|
0 / 0 / 0
Регистрация: 22.02.2016
Сообщений: 27
|
|||||
| 03.08.2017, 02:30 | |||||
|
Даже не знаю, что Вам и сказать, милейший. Видимо склонность придумывать новые языки программирования повлияла на Ваше понимание того, что такое языки общения. Понимаете, язык общения призван доносить информацию от одного интеллекта к другому. Для этой цели принято одно понятие обозначать одним и тем же набором звуков. Всякий же, кто для одного и того же понятия сначала использует несколько различных наборов звуков, а потом на основе того, что существуют разные наборы звуков начинает утверждать, что это есть разные понятия - вносит сумятицу и непонимание. А потому, когда Вы пытаетесь убедить меня, что код - это не подпрограмма, а подпрограмма - это не код, а код - это не макрос, а макрос - это не подстановка, а подстановка - это вообще никакого отношения к языкам программирования не имеет, Вы порождаете тех, кто потом пишет такие программы, из-за которых у обычный пользователей волосы на голове дыбом встают. И подпрограмма, и макрос - это суть одно и то же явление, и оба эти явления - суть код. Точка. Они имеют один и то же вид, они выполняют одни и те же задачи, и они одинаково применяются. И вся разница только в том, что такие как Вы одному и тому же явлению дают два разных названия, а потом вдруг оказывается, что это разные вещи. Зачем столько лет быть программистом, чтобы самому себя запутывать и других тоже? Ну я бы еще понял преподавателей из институтов, которым нужно как-то перед студентами делать вид, что они умнее студентов, что бы студенты им бабло в мешках носили, а потому - чем надежнее студента запутаешь, тем лучше... но здесь же не университет и сюда Вам бабло не принесут, чтобы поклониться Вашей мудрости - здесь то зачем эти петли нарезать? А потом бедные дипломированные программисты, уверены, что системный блок - это черный ящик, внутри которого волшебная мана в зависимости от вида организует им то функциональное метакриптирование, а то абстрактно-ориентированное субпроцедурирование. И невдомек им, что там внутри просто квадратики да проводки на подложке. Не путайте никого, пожалуйста. Программа - это законченный кусок кода, который выполняет всю поставленную задачу. Подпрограмма - это часть программы в любом виде. Макрос - это подпрограмма, и он то же код. Технология вызова того или иного по факту никакого значения не имеет и ничего не меняет, тем более, что в машинных кодах она везде и всегда одинакова - это просто оператор безусловного перехода. ВСЕ. И чем больше в ЯВУ создают терминологических наслоений одного на другое, тем больше себя же сами и запутывают. А потом не понятно почему в железяке элементарная штука постоянно вылетает в лютый блэк-аут. А все потому, что бедному программисту мозг промыли и он потерялся во всех этих псевдо-определениях и парадигмах. Если Вы разработали некий метод, который позволяет решать некоторую задачу, то это именно метод. Никакого отношения к определению сути остальных вещей, которые Вы используете в своем методе, это не имеет. Какая разница каким образом у Вас выполняется некоторая часть кода - то ли Вы ее вставляете в код основной программы, а то ли Вы ее "вызываете"? Суть одна и та же - в нужном месте будет выполнен заданный кусок кода. КОДА! И этот кусок кода будет лишь частью общей последовательности всех кодов основной программы. Эти куски и есть - подпрограммы. Опять таки - не важно в каком виде они существуют - записаны они в отдельных файлах или влеплены в основной. Макрос, подпрограмма, функция - все это одно и то же явление! И работает оно одинаково. Различия, которыми Вы пытаетесь их наделить существуют лишь в Вашем воображении на том уровне абстракции, который Вы избрали для проектирования своих алгоритмов. Вот уж воистину - и смешал Бог Яхве их языки, и перестали понимать друг друга. Добавлено через 5 минут Я занимаюсь разработкой архитектуры вычислительных устройств и созданием команд для ее использования в машинных кодах - какие в баню "интерпретаторщики"? Я вижу великая Тьма опустилась на очи наших программистов. Оттого то у них все программное обеспечение написано такими кривыми руками, что они понятия про элементарные вещи не имеют. Ладно, щас я Вам заделаю "интерпретацию"... ...а скажите ка бетенька - сколько в алгоритмической логике существует базовых логических элементов?
0
|
|||||
|
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
|
|||||||
| 03.08.2017, 04:49 | |||||||
|
Или иметь любой другой механизм возврата управления именно туда откуда ее вызвали ? А что же тогда сопрограмма ? Добавлено через 8 минут Добавлено через 3 минуты Добавлено через 3 минуты Добавлено через 5 минут З.Ы, Короче, предлагаю создать подраздел Клиника и свалить этот топик туда.
0
|
|||||||
|
0 / 0 / 0
Регистрация: 22.02.2016
Сообщений: 27
|
||||||
| 03.08.2017, 09:33 | ||||||
|
Я у Вас спросил не про схемотехнику, а про алгоритмическую логику и в оной существует всего 2 базовых логических элемента - операция и условный переход. Все. Больше ничего. Даже безусловный переход является абстракцией первого уровня над физическим уровнем логики. И все именно так печально потому, что такова природа вещей в нашем трех-мерном мире - любая последовательная связь состоит из двух типов элементов: прямая связь и развилка связей, то есть - веточка и узел, в котором веточка разделяется на несколько веточек. Тоже самое и в электронике - проводник и элемент, позволяющий разделить сигнал на разные потоки. Все. Ничего более в природе нашей вселенной не существует. Соответственно, любая законченная программа (полный ее алгоритм) - это набор двух типов связей, указанных выше. Он подобен дереву - ствол, разветвление, дальше веточки, на каждой свои разветвления и так далее, до физического предела. И все это дерево - есть программа. А любая его меньшая часть (под-уровень программы) называется подпрограммой. Веточку с одной стороны желтой краской пометил, а с другой красной - и все, что между этими двумя маркерами - это отдельный кусок кода (алгоритма), и он - есть подпрограмма. Как бы Вы не хотели, но на физическом уровне он будет работать одинаково в не зависимости от того как Вы его обозвете - макросом, функцией, структурой, библиотекой, классом, объектом, субъектом, элементом, системой, да хоть хрено-темой, суть от этого не меняется. Даже если Вы эту веточку положите в отдельный файл, она будет считана из файла и в области памяти присоединена к основному коду программы и в конечном итоге Вы получите полный алгоритм этой самой программы. Через какие команды, операторы, инструкции и вызовы Вы будете обращаться к этому куску кода не имеет никакого значения, потому что на самом деле Вы просто перенесете центр внимания процессора на определенную область памяти, в самое начало этой области - и все, больше там ничего не происходит. Ну и вот, этому всему Вы придумываете десятки и сотни названий. И, заметьте, это еще на уровне абстракций ЯНУ - ассемблера. А что творится в мозгах тех, кто работают с джавами и шарпами Вы хоть представляете? Там тысячи определений одного и того же явления и у каждого из них, в виду того, что это операторы языка программирования, может быть целый список обязательных и необязательных определений и прочего мусора... как эти люди вообще могут писать хоть что-то, что в результате можно будет назвать программой? И ведь они реально не представляют что происходит на самом деле. В их головах такие абстракции бродят, что иной раз даже трудно представить, что это физически можно выполнить на существующем в природе железе. А именно эти люди, по идее, должны писать простые и надежные программы. И у них - не получается. У них все ПО в мире - это заплатки, нашитые на костыли, подставленные под прокладки, положенные на замазку в тех местах, где ВНЕЗАПНО "почему-то" все дало трещины и никто не понимает откуда оно повылезло. Вы сейчас поняли о чем я вообще говорю или как об стенку горохом? Здравый смысл нам подсказывает, что эффективной может быть только работа с доступным нашему пониманию по уровню простоты, понятности и объема видом интеллектуального материала. Отсюда, в любом деле, а особенно в таком сложном с интеллектуальной точки зрения как Информационные Технологии, любой объект должен проектироваться с точки зрения максимальной унификации, упрощения и очевидности. А если Вы на корню вырубаете эти простые правила еще на уровне ЯНУ, то где же потом этому здравому смыслу взяться в конечном продукте - ПО и железе сегодняшнего дня? С другой стороны, современные программисты в большинстве своем даже элементарных основ логики не знают, не понимают - что такое алгоритм, как он устроен и зачем существует. Недавно на одном форуме нарвался на парня, который ринулся создавать СВЕРХ-язык программирования, язык всех языков, который бы мог описывать и переводить друг в друга абсолютно любые парадигмы программирования, в том числе и такие, которые еще не существуют в природе. И вот этот то парень, при том, что он знает такое слово, как "алгоритм" - ни малейшего представления о его сути не имеет. Смешно было так, что я чуть живот не надорвал... хоть в одно и то же время - весьма грустно. Так вот, если до того дошло, что базовые элементы мира информационных технологий, которые программисты и схемотехники должны еще в детском саду изучать, ибо на них, как на фундаменте, стоит весь этот хрупкий мирок, для Вас являются "Клиникой" - то можете сваливать, может хоть в Клинике отдельные разумные люди смогут познать то, что такие профессионалы как Вы их не в состоянии научить даже в институтах. А Вы продолжайте писать словари СИНОНИМОВ технических терминов - это и действительно, как я погляжу, весьма полезно если нужно взорвать себе мозг окончательно.
0
|
||||||
|
197 / 89 / 15
Регистрация: 10.07.2016
Сообщений: 146
|
||||||
| 03.08.2017, 11:09 | ||||||
![]()
0
|
||||||
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 03.08.2017, 12:29 [ТС] | |
|
Дабы не нарушать своими халтурными суждениями размышлений Гуру о Великом, я пожалуй, откланяюсь.
Боюсь даже читать всё это, дабы не запутаться в терминах и не замкнуться в себе из-за ощущения собственной никчёмности ![]() Чего и вам, друзья, рекомендую ![]() Добавлено через 5 минут А если серьёзно, flamehowk, если из этой идеи получится что-то стоящее, я первый выдам аплодисменты стоя. Но пока, исходя из этого Comedy Club feat. Cirque du Soleil, что здесь происходят...
1
|
|
|
0 / 0 / 0
Регистрация: 22.02.2016
Сообщений: 27
|
||||
| 04.08.2017, 12:11 | ||||
Ловлю на слове
0
|
||||
| 04.08.2017, 12:11 | |
|
Помогаю со студенческими работами здесь
16
Сложные программы (игры) на Qbasic. Что можно сделать и есть ли предел? Что можно сделать, чтобы ноутбук сильно не перенагревался? Какие есть способы? Хорошая сборка или нет? Наверняка есть, что можно сделать лучше, поэтому буду рад критике Макрос [FASM] - как обратиться к макросу и как передать параметр в макрос Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|