jcxz 231 7 апреля Опубликовано 7 апреля · Жалоба 5 часов назад, EdgeAligned сказал: если 5 умножить на 4, сколько будет - 9 или 20? 🙂 Так же и с операндами. Почти каждая инструкция имеет свой вариант, различающийся по диапазонам применимости и по действию. Но не во всех инструкциях есть эти варианты. И надо помнить, где что есть. Что за "варианты" которые нужно обязательно помнить программисту на ассемблере? О чём вы? Пишу на асме для ARM-а частенько. Так как мне нужно писать не только код, рисующий кнопочки и моргающий лампочками (как некоторым тут). Но частенько нужно писать и тяжёлый вычислительный код. На пределе возможностей CPU. Никаких проблем с простейшей системой команд ARM не имею. Когда писал на DSP, количество инструкций было в разы больше, чем у ARM и заковыристее в разы. И то как-то умудрялся писать намного лучше компилятора. 5 часов назад, EdgeAligned сказал: Написать по-простому, используя базовые методы, это можно. Но соревноваться в эффективности (скорости, размере) с компилятором - не имеет особого смысла. Полтора года работы на то, что компилятор сделает за несколько секунд, был бы он правильно настроен 🙂 Да ладно?? Прям полтора года?!! Любите же вы набросить на вентилятор! Умелый программист на асме (имеющий голову на плечах чтобы не только в неё есть) даже сейчас в большинстве случае напишет код лучше компилятора. Типичный код - вряд-ли в разы лучше (просто некуда так оптимизировать). Но вот какой-то специализированный код, связанный с цифровой обработкой сигналов или какими-то сложными вычислениями - умелый асм-программист запросто может и в несколько раз лучше написать. PS: Эта тема (о непобедимости компиляторов) тут поднимается уже неоднократно. И поднимается почему-то программистами, которые на асме и не писали-то никогда. И они с пеной у рта доказывают, что это невозможно. Потому что они сами этого не умеют. Но я уже ранее приводил примеры алгоритмов, которые си-компилятор реализует в разы хуже умелого асм-программера. Потрудитесь полистать форум. Если вы не умеете писать лучше компилятора (тупой железки между прочим), то это именно вы и не нужно обобщать на всех. Человек умеющий думать и не ленящийся это делать, и готовый тратить время на саморазвитие, в большинстве случаев напишет код лучше си-компилятора. Чтобы это понимать, достаточно хоть иногда заглядывать в листинги си-компиляторов. Там сразу видно, насколько оптимальнее можно написать асм-код если писать его самостоятельно. PPS: Чтобы не быть голословным, приведу пример простейшей функции: //Вычисляет длину UTF-8 строки в символах и байтах. //Вызывает TRAP_UTF8 при некорректном формате UTF-8 строки. //return: мл.32бита - длина в символах; ст.32бита - в байтах. u64 StrlenUtf8(void const *str) { u8 const *s = (u8 const *)str - 1; uint c, i, n = 0; for (; c = *++s; n++) { if (!(i = __CLZ(~((u32)c << 24)))) continue; if ((i -= 2) > 2u) trap(TRAP_UTF8, (u32)str); n += i + 1; do if (*++s >> 6 != 2) trap(TRAP_UTF8, (u32)str); while ((int)--i >= 0); } return n | (u64)((u32)s - (u32)str) << 32; } Вот что получилось у IAR-а на максимальной балансной оптимизации: u64 StrlenUtf8(void const *str) { _Z10StrlenUtf8PKv: (+1) 00000000 0xB430 PUSH {R4,R5} 00000002 0x4603 MOV R3,R0 u8 const *s = (u8 const *)str - 1; 00000004 0x1E5C SUBS R4,R3,#+1 uint c, i, n = 0; 00000006 0x2200 MOVS R2,#+0 00000008 0x4619 MOV R1,R3 0000000A 0xE015 B.N ??StrlenUtf8_0 for (; c = *++s; n++) { if (!(i = __CLZ(~((u32)c << 24)))) continue; ??StrlenUtf8_1: (+1) 0000000C 0xEA6F 0x6000 MVN R0,R0, LSL #+24 00000010 0xFAB0 0xF580 CLZ R5,R0 00000014 0xB17D CBZ.N R5,??StrlenUtf8_2 if ((i -= 2) > 2u) trap(TRAP_UTF8, (u32)str); 00000016 0x1EAD SUBS R5,R5,#+2 00000018 0x2D03 CMP R5,#+3 0000001A 0xBF24 ITT CS 0000001C 0x2016 MOVCS R0,#+22 0000001E 0xDF01 SVCCS 0x1 n += i + 1; 00000020 0x1C68 ADDS R0,R5,#+1 00000022 0x1882 ADDS R2,R0,R2 do if (*++s >> 6 != 2) trap(TRAP_UTF8, (u32)str); ??StrlenUtf8_3: (+1) 00000024 0xF814 0x0F01 LDRB R0,[R4, #+1]! 00000028 0x0980 LSRS R0,R0,#+6 0000002A 0x2802 CMP R0,#+2 0000002C 0xBF1C ITT NE 0000002E 0x2016 MOVNE R0,#+22 00000030 0xDF01 SVCNE 0x1 while ((int)--i >= 0); 00000032 0x1E6D SUBS R5,R5,#+1 00000034 0xD5F6 BPL.N ??StrlenUtf8_3 } ??StrlenUtf8_2: (+1) 00000036 0x1C52 ADDS R2,R2,#+1 ??StrlenUtf8_0: (+1) 00000038 0xF814 0x0F01 LDRB R0,[R4, #+1]! 0000003C 0x2800 CMP R0,#+0 0000003E 0xD1E5 BNE.N ??StrlenUtf8_1 return n | (u64)((u32)s - (u32)str) << 32; 00000040 0x1AE1 SUBS R1,R4,R3 00000042 0xBC30 POP {R4,R5} 00000044 0x4610 MOV R0,R2 00000046 0x4770 BX LR ;; return } Вы видите его косяки? Нет? А я вижу. И довольно много. А значит аналогичную функцию на асме я могу написать лучше (короче и быстрее). И это простейшая функция. Без какой-либо цифровой обработки. А с увеличением размера и сложности функций по моим наблюдениям - неэффективность си-компилятора быстро растёт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 81 7 апреля Опубликовано 7 апреля · Жалоба 1 час назад, jcxz сказал: А значит аналогичную функцию на асме я могу написать лучше (короче и быстрее). А напишите. 🙂 1 час назад, jcxz сказал: Прям полтора года?!! 17 часов назад, tonyk_av сказал: Автор утверждает, что это увеличило быстродействие в 2.5 раза по сравнению с вариантом на С. Говорит, 1.5 года писал. 1 час назад, jcxz сказал: Если вы не умеете писать лучше компилятора (тупой железки между прочим), то это именно вы и не нужно обобщать на всех. Да, я не умею писать лучше компилятора. Вы умеете? Молодец. Где ж вы раньше были, вы же гений просто (почти без сарказма)! Можно посмотреть ваши готовые, доведенные до конца проекты полностью на ассемблере? Ну и напомню - изначально разговор не об ассемблерных вставках на 10-30 строк (которые есть даже в FreeRTOS), а о полном написании всего проекта на ассемблере от начала до кончала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 7 апреля Опубликовано 7 апреля · Жалоба 22 минуты назад, EdgeAligned сказал: А напишите. 🙂 Я уже привёл здесь факты (не голословные утверждения, не пустой наброс на вентилятор) - лог компилятора с множеством ошибок оптимизации. Теперь ваша очередь: укажите какие ошибки оптимизации вы там видите? (а там их много) 22 минуты назад, EdgeAligned сказал: Можно посмотреть ваши готовые, доведенные до конца проекты полностью на ассемблере? Я разве где-то утверждал такое??? Приведите пожалуйста цитату. 22 минуты назад, EdgeAligned сказал: Ну и напомню - изначально разговор не об ассемблерных вставках на 10-30 строк (которые есть даже в FreeRTOS), а о полном написании всего проекта на ассемблере от начала до кончала. Это где такой изначальный разговор был? Потрудитесь заглянуть в начало темы. Опять передёргиваете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 81 7 апреля Опубликовано 7 апреля (изменено) · Жалоба Я просто знаю творчество топикстартера - он пытается писать целиком на ассемблере от начала до кончала. А вы так можете? 🙂 Если бы могли, были бы гениальным (без сарказма) программистом. Ассемблерные вставки то любой балбес может сделать, а вот целиком... 😄 Кстати, коль уж так прекрасно (без сарказма) разбираетесь в ассемблере, помогли бы топикстартеру, чтоль... А то спорить все любят, а помочь по делу, коль есть знания... Изменено 7 апреля пользователем EdgeAligned Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 7 апреля Опубликовано 7 апреля · Жалоба 13 минут назад, EdgeAligned сказал: он пытается писать целиком на ассемблере от начала до кончала. А вы так можете? 🙂 Если бы могли, были бы гениальным (без сарказма) программистом. Я могу. И писал ранее. На DSP. DSP по архитектуре и системе команд кратно сложнее ARM-а. Если сомневаетесь - почитайте например про ядро TMS320VC55xx. ARM по сравнению с ним - детский сад. И не я один - даже здесь на форуме есть люди, умеющие писать на ассемблере. 13 минут назад, EdgeAligned сказал: Ассемблерные вставки то любой балбес может сделать, а вот целиком... 😄 Сейчас нет необходимости писать полностью на ассемблере на ARM (по-крайней мере у меня). Но есть проекты, где имеются asm-функции на несколько сотен команд. И не "вставки", а полноценный ассемблер. Потому как на си там просто невозможно реализовать - слишком глупы современные си-компиляторы, не хватит быстродействия. 13 минут назад, EdgeAligned сказал: Кстати, коль уж так прекрасно (без сарказма) разбираетесь в ассемблере, помогли бы топикстартеру, чтоль... А то спорить все любят, а помочь по делу, коль есть знания... ТС-у помогать бесполезно. Да и ранее он писал, что хочет писать не на ассемблере, а в машинных кодах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 81 7 апреля Опубликовано 7 апреля (изменено) · Жалоба На машинных кодах? Серьезно чтоль? Машкоды - это 2547 3880 6647 6642 и тп. Ассемблер - это текстовые мнемоники, назначенные машкодам. Писать на исинных числовых машкодах в нашем тысячелетии будет только упоротый #%#@. На машкодах прогали в прошлом тысячелетии на перфокартах, прокалыванием дырдочек. В нашем тысячелетии лично я один раз в жизни исправил пару циферок в готовом хексе, просто зная, где и что надо исправить. Изменено 7 апреля пользователем EdgeAligned Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 7 апреля Опубликовано 7 апреля (изменено) · Жалоба 5 минут назад, EdgeAligned сказал: На машинных кодах? Серьезно чтоль? Машкоды - это 2547 3880 6647 6642 и тп. Да, я тоже помню это, где-то с год назад на ТСа это "снизошло", я не знаю, что у него за вещества, но наверно классные))))))) ЗЫ. На счет асма, есть даже полнофункциональные ОС написанные на асме, да еще и х86, я даже не представляю, что б сказал какому-нить заказчику, который мне предложил такой ТЗ, ну наверно весь свой матерный запас бы вспомнил, о они ничего так, на интузиазме такое творили, может и до сих пор чего-то пишут))))))))))))) Изменено 7 апреля пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 42 7 апреля Опубликовано 7 апреля · Жалоба 21 hours ago, EdgeAligned said: В 2,5 раза прям? Сам я не тестировал, потому и написал "со слов автора". ARM делала систему команд с оглядкой на эффективность компиляции, а вот х86 на удобство программирования на ассемблере в силу своей древности, поэтому тягаться в эффективности кодирования с компилятором для ARM я бы не стал. Допускаю, что на ассме можно использовать специфику конкретного процессора и получить большое ускорение, но это означает жёсткую привязку к конкретному процессору и/или архитектуре. Кстати, про 2.5. Действительно, при оптимизации по скорости примерно во столько раз ускоряется программа. Так что версия с не включенной оптимизацией компилятора выглядит логичной. 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 7 апреля Опубликовано 7 апреля · Жалоба 2 часа назад, tonyk_av сказал: Допускаю, что на ассме можно использовать специфику конкретного процессора и получить большое ускорение, но это означает жёсткую привязку к конкретному процессору и/или архитектуре. А расскажите нам - как написать программу для МК без "жёсткой привязки к конкретному процессору и/или архитектуре"? Прям можете на си написать программу, которая будет выполняться скажем на LPC1758 и на STM8L151 и на TMS320VC5502??? Пример в студию! ЗЫ: Априори - все программы, которые пишутся для МК, на любом языке, имеют "жёсткую привязку к конкретному процессору и/или архитектуре". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
girts 9 7 апреля Опубликовано 7 апреля (изменено) · Жалоба 4 hours ago, tonyk_av said: а вот х86 на удобство программирования на ассемблере в силу своей древности Ха! 16-бит проц на 5...10 мгц и адресной шиной шириной в 20 проводов? Да это на уровне почти любого современного микроконтроллера. Весь древний IBM в железном чумодане недотягивает до одного кристалла dsPIC... И естественно приходилось всякое сотворять именно в ASM из за ограниченности ресурсов. Да все драйвера клавиатуры под кирилицу.... Ибо суждено ему сидеть резидентом в памяти, и место занимать по возможности поскромнее. Кстати, тогда программисты умели писать красивый код, ибо жизнь заставляла.... Ща просто берут проц помощнее, если изделие моргает светодиодами слишком медленно. Про 2.5х - может и преувеличение, но если посмотреть на то, что генерит компилятор, там внатуре много лишнего и всяких страховок на все случаи жизни, а также и на ещё не написанный код. Изменено 7 апреля пользователем girts Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 8 апреля Опубликовано 8 апреля · Жалоба Модератор: @do_not_know_Linux, я Вас уже предупреждал о правилах 2.1.в. Не игнорируйте. Остальных участников прошу не отклоняться от темы. Напомню, она про FPU в STM32H7. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 42 8 апреля Опубликовано 8 апреля (изменено) · Жалоба 12 hours ago, jcxz said: А расскажите нам - как написать программу для МК без "жёсткой привязки к конкретному процессору и/или архитектуре"? Внимательней читайте, что написано: "на ассме можно использовать специфику конкретного процессора". Уверен, что, jcxz отличает МК от процессора. Речь шла о том, что зная специфику алгоритма можно на асме использовать более короткие и быстрые цепочки команд, нежели те, что использует компилятор, строящий код по своим правилам без учёта такой специфики. 12 hours ago, jcxz said: Прям можете на си написать программу, которая будет выполняться скажем на... У китайцев же есть МК с одинаковой периферией, но разными ядрами, ARM и RISC-V. 9 hours ago, girts said: Весь древний IBM в железном чумодане недотягивает до одного кристалла dsPIC... Смотря что с чем сравнивать. Особенностью х86 является туева хуча режимов адресации и просто обилие команд на все случаи жизни, чего нет в ARM и RISC-V. По этой причине ни один компилятор не использует весь арсенал команд х86, в отличие от компиляторов для RISC-архитектур. 9 hours ago, girts said: Про 2.5х - может и преувеличение Ни какого преувеличения. Буквально на прошлой неделе не включил оптимизацию в компиляторе и мог наблюдать это двух с половиной кратное отставание по скорости отладочной версии от рабочей. Изменено 8 апреля пользователем tonyk_av 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться