Перейти к содержанию
    

5 часов назад, EdgeAligned сказал:

если 5 умножить на 4, сколько будет - 9 или 20? 🙂 Так же и с операндами. Почти каждая инструкция имеет свой вариант, различающийся по диапазонам применимости и по действию. Но не во всех инструкциях есть эти варианты. И надо помнить, где что есть.

Что за "варианты" которые нужно обязательно помнить программисту на ассемблере? О чём вы? :wacko2:

Пишу на асме для ARM-а частенько. Так как мне нужно писать не только код, рисующий кнопочки и моргающий лампочками (как некоторым тут). Но частенько нужно писать и тяжёлый вычислительный код. На пределе возможностей CPU. Никаких проблем с простейшей системой команд ARM не имею. Когда писал на DSP, количество инструкций было в разы больше, чем у ARM и заковыристее в разы. И то как-то умудрялся писать намного лучше компилятора.

5 часов назад, EdgeAligned сказал:

Написать по-простому, используя базовые методы, это можно. Но соревноваться в эффективности (скорости, размере) с компилятором - не имеет особого смысла. Полтора года работы на то, что компилятор сделает за несколько секунд, был бы он правильно настроен 🙂

Да ладно?? Прям полтора года?!! Любите же вы набросить на вентилятор!  :sarcastic:

Умелый программист на асме (имеющий голову на плечах чтобы не только в неё есть) даже сейчас в большинстве случае напишет код лучше компилятора. Типичный код - вряд-ли в разы лучше (просто некуда так оптимизировать). Но вот какой-то специализированный код, связанный с цифровой обработкой сигналов или какими-то сложными вычислениями - умелый асм-программист запросто может и в несколько раз лучше написать.

 

PS: Эта тема (о непобедимости компиляторов) тут поднимается уже неоднократно. И поднимается почему-то программистами, которые на асме и не писали-то никогда. И они с пеной у рта доказывают, что это невозможно. Потому что они сами этого не умеют.:mosking:  Но я уже ранее приводил примеры алгоритмов, которые си-компилятор реализует в разы хуже умелого асм-программера. Потрудитесь полистать форум.

Если вы не умеете писать лучше компилятора (тупой железки между прочим), то это именно вы и не нужно обобщать на всех. Человек умеющий думать и не ленящийся это делать, и готовый тратить время на саморазвитие, в большинстве случаев напишет код лучше си-компилятора. Чтобы это понимать, достаточно хоть иногда заглядывать в листинги си-компиляторов. Там сразу видно, насколько оптимальнее можно написать асм-код если писать его самостоятельно.

 

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
          }                                                      

Вы видите его косяки? Нет? А я вижу. И довольно много. А значит аналогичную функцию на асме я могу написать лучше (короче и быстрее).

И это простейшая функция. Без какой-либо цифровой обработки. А с увеличением размера и сложности функций по моим наблюдениям - неэффективность си-компилятора быстро растёт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

А значит аналогичную функцию на асме я могу написать лучше (короче и быстрее).

А напишите. 🙂
 

1 час назад, jcxz сказал:

Прям полтора года?!!

17 часов назад, tonyk_av сказал:

Автор утверждает, что это увеличило быстродействие в 2.5 раза по сравнению с вариантом на С. Говорит, 1.5 года писал.

1 час назад, jcxz сказал:

Если вы не умеете писать лучше компилятора (тупой железки между прочим), то это именно вы и не нужно обобщать на всех.

Да, я не умею писать лучше компилятора. Вы умеете? Молодец. Где ж вы раньше были, вы же гений просто (почти без сарказма)! Можно посмотреть ваши готовые, доведенные до конца проекты полностью на ассемблере?

Ну и напомню - изначально разговор не об ассемблерных вставках на 10-30 строк (которые есть даже в FreeRTOS), а о полном написании всего проекта на ассемблере от начала до кончала. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, EdgeAligned сказал:

А напишите. 🙂

Я уже привёл здесь факты (не голословные утверждения, не пустой наброс на вентилятор) - лог компилятора с множеством ошибок оптимизации.

Теперь ваша очередь: укажите какие ошибки оптимизации вы там видите?

(а там их много)

22 минуты назад, EdgeAligned сказал:

Можно посмотреть ваши готовые, доведенные до конца проекты полностью на ассемблере?

Я разве где-то утверждал такое??? Приведите пожалуйста цитату.

22 минуты назад, EdgeAligned сказал:

Ну и напомню - изначально разговор не об ассемблерных вставках на 10-30 строк (которые есть даже в FreeRTOS), а о полном написании всего проекта на ассемблере от начала до кончала. 

Это где такой изначальный разговор был? Потрудитесь заглянуть в начало темы. Опять передёргиваете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я просто знаю творчество топикстартера - он пытается писать целиком на ассемблере от начала до кончала. А вы так можете? 🙂 Если бы могли, были бы гениальным (без сарказма) программистом. Ассемблерные вставки то любой балбес может сделать, а вот целиком... 😄 

Кстати, коль уж так прекрасно (без сарказма) разбираетесь в ассемблере, помогли бы топикстартеру, чтоль... А то спорить все любят, а помочь по делу, коль есть знания...

 

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, EdgeAligned сказал:

он пытается писать целиком на ассемблере от начала до кончала. А вы так можете? 🙂 Если бы могли, были бы гениальным (без сарказма) программистом.

Я могу. И писал ранее. На DSP. DSP по архитектуре и системе команд кратно сложнее ARM-а. Если сомневаетесь - почитайте например про ядро TMS320VC55xx. ARM по сравнению с ним - детский сад.

И не я один - даже здесь на форуме есть люди, умеющие писать на ассемблере.

13 минут назад, EdgeAligned сказал:

Ассемблерные вставки то любой балбес может сделать, а вот целиком... 😄 

Сейчас нет необходимости писать полностью на ассемблере на ARM (по-крайней мере у меня). Но есть проекты, где имеются asm-функции на несколько сотен команд. И не "вставки", а полноценный ассемблер. Потому как на си там просто невозможно реализовать - слишком глупы современные си-компиляторы, не хватит быстродействия.

13 минут назад, EdgeAligned сказал:

Кстати, коль уж так прекрасно (без сарказма) разбираетесь в ассемблере, помогли бы топикстартеру, чтоль... А то спорить все любят, а помочь по делу, коль есть знания...

ТС-у помогать бесполезно. Да и ранее он писал, что хочет писать не на ассемблере, а в машинных кодах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На машинных кодах? Серьезно чтоль? Машкоды - это 2547 3880 6647 6642 и тп. Ассемблер - это текстовые мнемоники, назначенные машкодам.
Писать на исинных числовых машкодах в нашем тысячелетии будет только упоротый #%#@. На машкодах прогали в прошлом тысячелетии на перфокартах, прокалыванием дырдочек. В нашем тысячелетии лично я один раз в жизни исправил пару циферок в готовом хексе, просто зная, где и что надо исправить.

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, EdgeAligned сказал:

На машинных кодах? Серьезно чтоль? Машкоды - это 2547 3880 6647 6642 и тп.

Да, я тоже помню это, где-то с год назад на ТСа это "снизошло", я не знаю, что у него за вещества, но наверно классные)))))))

ЗЫ. На счет асма, есть даже полнофункциональные ОС написанные на асме, да еще и х86, я даже не представляю, что б сказал какому-нить заказчику, который мне предложил такой ТЗ, ну наверно весь свой матерный запас бы вспомнил, о они ничего так, на интузиазме такое творили, может и до сих пор чего-то пишут)))))))))))))

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 hours ago, EdgeAligned said:

В 2,5 раза прям?

Сам я не тестировал, потому и написал "со слов автора".

 

ARM делала систему команд с оглядкой на эффективность компиляции, а вот х86 на удобство программирования на ассемблере в силу своей древности, поэтому тягаться в эффективности кодирования с компилятором для ARM я бы не стал. Допускаю, что на ассме можно использовать специфику конкретного процессора и получить большое ускорение, но это означает жёсткую привязку к конкретному процессору и/или архитектуре.

 

Кстати, про 2.5. Действительно, при оптимизации по скорости примерно во столько раз ускоряется программа. Так что версия с не включенной оптимизацией компилятора выглядит логичной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, tonyk_av сказал:

Допускаю, что на ассме можно использовать специфику конкретного процессора и получить большое ускорение, но это означает жёсткую привязку к конкретному процессору и/или архитектуре.

 А расскажите нам - как написать программу для МК без "жёсткой привязки к конкретному процессору и/или архитектуре"? Прям можете на си написать программу, которая будет выполняться скажем на LPC1758 и на STM8L151 и на TMS320VC5502??? Пример в студию!  :sarcastic:

 

ЗЫ: Априори - все программы, которые пишутся для МК, на любом языке, имеют "жёсткую привязку к конкретному процессору и/или архитектуре".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, tonyk_av said:

а вот х86 на удобство программирования на ассемблере в силу своей древности

Ха!
16-бит проц на 5...10 мгц и адресной шиной шириной в 20 проводов?
Да это на уровне почти любого современного микроконтроллера.
Весь древний IBM в железном чумодане недотягивает до одного кристалла dsPIC... 

И естественно приходилось всякое сотворять именно в  ASM из за ограниченности ресурсов.
Да все драйвера клавиатуры под кирилицу.... Ибо суждено ему сидеть резидентом в памяти, и место занимать по возможности поскромнее.
Кстати, тогда программисты умели писать красивый код, ибо жизнь заставляла.... Ща просто берут проц помощнее, если изделие моргает светодиодами слишком медленно.

Про 2.5х - может и преувеличение, но если посмотреть на то, что генерит компилятор, там внатуре много лишнего и всяких страховок на все случаи жизни, а также и на ещё не написанный код.

Изменено пользователем girts

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Модератор: @do_not_know_Linux, я Вас уже предупреждал о правилах 2.1.в. Не игнорируйте.

Остальных участников прошу не отклоняться от темы. Напомню, она про FPU в STM32H7.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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х - может и преувеличение

Ни какого преувеличения. Буквально на прошлой неделе не включил оптимизацию в компиляторе и мог наблюдать это двух с половиной кратное отставание по скорости отладочной версии от рабочей.

Изменено пользователем tonyk_av

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...