Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

'Реверс' SDK Espressif и ROM-BIOS для создания открытого SDK.

Тема в разделе "SDK и создание собственных прошивок", создана пользователем pvvx, 16 апр 2015.

  1. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    Там всего загрузчик, без какой-либо операционки и включения "кеширования" flash. Т.е. из него не вызвать процедуры из flash и его задача всего загрузка других кусков, да и он при этом занимает память IRAM. Могли бы его перенести и в другую область, которая затирается далее нужным кодом. Ведь он не нужен после загрузки. Короче это очередной китай-бред, связанный с тем, что у них уже ничего не лезет в 512к flash и для их системы обновления по сети.
    Да я ошибся. UTF8 конечно. Не важно какая локальная кодировка - git при передаче/приеме всё равно перекодирует, но надо правильно задать эти параметры и знать какие и где... Пока не заботился и сильно не копал это дело...
     
    Последнее редактирование: 4 июн 2015
  2. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Не думаю, во-первых это вроде энтузиастами сделано а не Espressif, а во-вторых оно как раз заточено под задачу произвольного хранения и загрузки неограниченного количества образов прошивок (в пределах мегабайта флешки). Про память - согласен, если тратит лишнее это не гуд, ее и так мало.

    UPD А как сделать чтобы память использовалась повторно?
     
  3. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    Вот и говорю - у него совершенно другая задача и это не самостоятельная примочка, а кусок созданный исключительно для китай-SDK :)
    А собираемое "творение" - это полноценная система. С ней можете странслировать и Дурино без WiFi. Такая система сделана для того, чтобы иметь максимум памяти и максимум производительности + минимум потребления и/или использовать модуль ESP8266 как обычный MCU без WiFi. Подгрузка китай-SDK c WiFi для передачи накопленных данных вписывается отдельным блоком, который запускается когда данные уже обработаны/готовы и положены в RTC_RAM или flash.
    Сейчас в данной системе не хватает только правильного sleep, с засыпанием CPU и т.д. (потребление модулем на уровне 2mA). Он представлен (все функции есть) в ROM-BIOS. Время его отработки от пары ms до ... Очень необходимая фича для ожидания готовности внешних датчиков. Необходимо дописать "сервис" обращения к ней (кто и почему вызывает просыпание, сколько предел по времени и т.д.) и ввести коррекции (она кривовата). Всё остальное, кроме специфических драйверов для внешних устройств уже есть в данном "OpenSDKnoWiFi"
    Этот sleep режим уже проверен и часть показана в блоке Код (C) dtm_params_init(NULL, NULL); dtm_set_params(0,3000*26/40,0,0,0); rtc_enter_sleep();
    Есть ещё второй режим sleep специфичный для самого CPU, так-же с задаваемыми источниками "просыпания" и временем в тактах CPU + callback-и. Так-же уже реализован в ROM-BIOS в ets_run(), но пока используется на 1%. Он требует немного специфичной политики организации работы с прерываниями таймеров и т.д. А в текущих Дуринах и прочих ПО это не используется и игнорируется - там у писателей главное побольше набить галочек и напихать побольше "портирований" всего и вся... :)
    PS: Я всегда за разнообразие, а не унификацию – “сделать всё серым”. Природа любит разнообразие и ничего лишнего и каждой фиговинке свои цели и программа… :) После "Дурин" большинство уже ничего не может сделать самостоятельно. И их много развелось - баланс нарушен :)
     
    Последнее редактирование: 4 июн 2015
  4. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    Кто может объяснить, почему в RTOS библиотеках включены все дубли кодов из ROM-BIOS? Это сделано чтобы неиспользуемого коду во flash было во много раз больше? (Китай-програмерам платят за каждую строчку кода, даже если он не нужен? :))
    https://github.com/espressif/esp_iot_rtos_sdk/tree/master/lib
     
  5. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    pvvx, мы же с Вами как раз сегодня про оптимизацию и дублирование разговаривали :) Вот китайцы молодцы, никогда не забывают скописатить код, даже если он их собственный :D

    Касательно RTOS: насколько он отличается, что там по DHCP (и можно ли использовать обычный)? Давно подумывал на него перейти.
     
    dronvolk нравится это.
  6. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    Дык уже проросло http://www.esp8266.com/viewtopic.php?t=3420&p=19449#p19444

    Там старая версия без излишков, но с дублями от первых либ v5 для WiFi (она полностью в ROM-BIOS, а SDK использует v6)
    Пример, как входят дубли в те либы:
    phy_chip_v5_ana_romfunc.o
    phy_chip_v6_ana.o
    phy_chip_v5_cal_romfunc.o
    phy_chip_v6_cal.o
    В v6 изменено до десяти функций. Список измененных уже приводился Код (Text).
    У измененных название начинается с "ram_...", а от v5 в ROM-BIOS = "rom_..."
    Используется DHCP из LwIP. И в SDK аналогично. Для ST - собственный-китайский :) В новом SDK 1.1.0 к ним подвязаны "события" типа GOT_IP... Это единственное правильное решение в их разработке, но сделано было криво...
    Open mdns адаптировать некогда. Китайцы какую-то open версию стырили и вставили.
    То, что лежит тут https://github.com/espressif/esp_iot_rtos_sdk/tree/master/third_party - это просто для приколу :)
    Процедуры ROM-BIOS и остальные либы SDK не могут работать с мультизадачкой. Это в них никак не предусмотрено и по этому про RTOS можно забыть, пока не напишите всё сами.

    Да, ещё отличие библиотек в RTOS от SDK1.1.0 в том, что китайцам пришлось "пойти на жертвы" - они выкинули часть неиспользуемых процедур из библиотек в SDK1.1.0, т.к. это уже никуда не лезло :)
     
    Последнее редактирование: 4 июн 2015
  7. JustACat

    JustACat Moderator Команда форума

    Сообщения:
    568
    Симпатии:
    121
    Оффтоп ^_^" (раскрыть)

    Не хочется вас наставлять, но, вот как раз поэтому, в основном, и переходят все постепенно на UTF. Все же кодировки вроде 1251 или KOI себя изживают. И их использование только порождает в итоге проблемы.
    Взять для примера хотя б Pebble - как они лоханулись, что в свой первый пебл не внедрили сразу юникод?.. Потом допиливали, мучились, не влезало. А заложили бы сразу - и проблемы бы не было вовсе.
    Какой сейчас выигрыш от старых кодировок? Только размер файла разве что?..
    В общем, не мне вас, @pvvx, учить и наставлять, конечно. Но все же хотелось бы, чтобы и вы перешли на светлую сторону силы UTF ^_^"

    А мож правда так? Это даже ведь имеет название "Индусский код".
     
  8. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    JustACat - вопрос в том, что надо указать в TortoiseGit 1.8.14.0, чтобы он нормально перекодировал любой формат.
    А расширение текстов и прочего в несколько раз по объему меня не устраивает. Пусть это будет на github, а у себя я буду использовать то, что совместимо с используемым мной ПО, пока не напишут замену с полной поддержкой UTF. Но этого пока не видать, т.к. причина не в том, а в том что везде насаждается английский (диалект США) язык. А от языка зависит многое...
    Писатели из США не утруждают себя поддержкой других языков, а я должен? :)
     
    JustACat нравится это.
  9. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    Проверил sleep в ROM-BIOS, который работает в est_run() без перезагрузки и с назначением события просыпания. (est_run() - это процедура исполняется всегда и в китай-SDK, в ней цикл с ожиданием прерываний)
    Код (Text):
    1. Test 'SDK no WiFi'
    2. Heap size:    81848 bytes
    3. Bss size:    40 bytes
    4. Stack pointer:    0x3fffffb0
    5. ets_delay_us(1000) dt=1000
    6. ets_delay_us(10000) dt=10001
    7. Test sleep (low power) 1000 ms, 7 cycles
    8. go ets_run()
    9. Test cb1, t=30907
    10. Test cb2, t=31888, dt=981
    11. Test cb1, t=33391
    12. Test cb2, t=34340, dt=949
    13. Test cb1, t=35843
    14. Test cb2, t=36792, dt=949
    15. Test cb1, t=38292
    16. Test cb2, t=39239, dt=947
    17. Test cb1, t=40744
    18. Test cb2, t=41692, dt=948
    19. Test cb1, t=43196
    20. Test cb2, t=44143, dt=947
    21. Test cb1, t=45647
    22. Test cb2, t=46593, dt=946
    23. Test cb1, t=48097
    24. Test cb2, t=49043, dt=946
    Т.к. sleep отключает всё, то приходится восстанавливать PLL после выхода к кварцу на 26MHz...
    Придется адаптировать/переписывать для OpenSDK, т.к. там назначается на событие просыпания всегда одна нога - GPIO2 и не правильно выставляется предельное время sleep в RTC (всё из-за кварца на 26MHz вместо 40MHz).
     
  10. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    То что сбивается это наверно достаточно закономерно, т.к. просыпание после deep sleep это фактически старт заново (с нуля). Или я ошибаюсь?
     
  11. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    deep sleep написан и работает (см. sys_deep_sleep()).
    А sleep - это выключение CPU и его потрахов (но не всех - RTC и другие блоки работают) на ходу. CPU останавливается, а после события продолжает работу с места "останова". Но и при этом почему-то его PLL сбита. Т.е. он продолжает работу с дефолтными установками и требует их восстановления.
    Режим sleep удобен тем, что просыпание более быстрое и ничего в памяти не сбито. Потребление в нем минимально (точно ещё не измерял). Время входа и выхода мало - ограничения только на время восстановления PLL и некоторых других аппаратных "опций". На просыпание, кроме ограничения ( время таймера на RTC вызывающего INT) назначается ещё любое событие - например перепад уровня на входной ножке. Он дает экономию питания при ожидании ответов с внешних устройств. Но для user-ов требуется написание простой системы назначения всего этого дела...
    Т.к. часы (CLK) у RTC не на кварце, а на внутреннем RC генераторе, то он неточный (зависит от температруры и т.д) и требует калибровки (регистры калибровки описаны в xls с GPIO). Перед входом в sleep она и выполняется (требуется > 100 us). Но можно и без калибровки, если она произведена заранее или точность предельного времени нахождения в sleep не требуется. Точное ограничение ожидания события от датчика обычно не требуется, т.к. оно используется как авария = датчик умер и не хочет отвечать :)
    ----
    Для deep_sleep (sleep через reset) есть ветка быстрого старта (возобновления) в ROM-BIOS, но её использовать сложно – требует определенного состояния выводов (как и при программировании), а так-же не хватает информации по чипу + потеря значений в памяти RTC из-за отсутствия подключенного внешнего источника питания к ноге VCC_RTC (ROM-BIOS анализирует при старте некоторые значения там и от них зависит “ветвь старта”).
     
    Последнее редактирование: 7 июн 2015
  12. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    Обобщая о системах low_power на ESP8266:

    На данном чипе мы имеем 3 системы low_power:

    1) Deep_sleep – sleep до события срабатывания “будильника” в RTC, назначенного на ножку вывода и соединенного с reset. При использовании SDKnoWiFi возобновление после deep_sleep < 30 ms.

    2) Sleep - sleep до события прерывания. Назначается прерывание по таймеру RTC. Всё остальное, кроме спец. прерываний по I/O вырубается. Выходом, продолжением исполнения кода CPU с места засыпания, является срабатывание прерывания или I/O или таймера RTC. При использовании SDKnoWiFi возобновление работы после sleep, с установкой PLL на 26MHz кварц < 150 us. Без, для прямого опроса датчика сразу - наносеки.

    3) Спец команда CPU * ожидания прерывания (ROM:40000F65: "waiti 0"). Глушит только CPU. Потребление модулем < 2 mA. Имеет установку ограничения времени нахождения CPU в данном режиме в спец. регистре CPU и задается в тактах CPU. Стоит в цикле ets_run(), где вечно сидит процессор. В итоге любой лишний включенный timer_arm() или безграмотный user-цикл опроса чего-либо (как в "Дуринах", особо её драйверах) увеличивает потребление чипом.
    Организуйте работу системы по событиям, по возможности без всяких delay( >1 ms) и длительных циклов опросов. По событию (CPU лучше включить на 180MHz), отработать и встать опять на "waiti" до следующего события. Если время ожидания и опрос позволяет использовать sleep или deep_sleep - то и использовать их. Тогда потребление будет минимальным.

    *The WAITI (Wait for Interrupt) instruction, which is a part of the Interrupt Option, saves power by setting the current interrupt level, powering down the processor’s logic, and waiting for an interrupt.
     
    Последнее редактирование: 7 июн 2015
    NutsXXXL нравится это.
  13. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    Протестировал потребление оптимизированного sys_delay_us() в замену est_delay_us():
    TstOpenSDKnoWiFi.gif
    log (раскрыть)
    Код (Text):
    1.  
    2. Test 'SDK no WiFi'
    3. Heap size:    81848 bytes
    4. Bss size:    40 bytes
    5. Stack pointer:    0x3fffffa0
    6. sys_delay_us(1000000), dt=1000004
    7. sys_delay_us(900000), dt=899999
    8. sys_delay_us(800000), dt=800000
    9. sys_delay_us(700000), dt=699999
    10. sys_delay_us(600000), dt=599999
    11. sys_delay_us(500000), dt=499999
    12. sys_delay_us(400000), dt=399999
    13. sys_delay_us(300000), dt=300000
    14. sys_delay_us(200000), dt=199999
    15. sys_delay_us(100000), dt=100000
    16. ets_delay_us(1000000) dt=500000
    17. Test sleep (low power) 1000 ms, 7 cycles
    18. go ets_run()
    19. Test cb1, t=6063443
    20. Test cb2, t=6065320, dt=1877
    21. Test cb1, t=6068129
    22. Test cb2, t=6069962, dt=1833
    23. Test cb1, t=6072766
    24. Test cb2, t=6074593, dt=1827
    25. Test cb1, t=6077392
    26. Test cb2, t=6079215, dt=1823
    27. Test cb1, t=6082023
    28. Test cb2, t=6083857, dt=1834
    29. Test cb1, t=6086658
    30. Test cb2, t=6088488, dt=1830
    31. Test cb1, t=6091300
    32. Test cb2, t=6093129, dt=1829
    33. Test cb1, t=6095940
    34. Test cb2, t=6097767, dt=1827
    35.  

    Модуль ESP-01 с горящим светодиодом, пуск с CH_PD.
    Что-то надо ещё отключить в потрохах ESP8266, но пока не нашел как и что... :)
     
    Последнее редактирование: 8 июн 2015
    NutsXXXL нравится это.
  14. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    Почуть-чуть проясняется с WiFi, хотя я этим не занимаюсь, рассчитывая на других :) Мне было многократно сказано, в переписке, что кто-то разгребает WiFi процедуры... но пока что-то не видно и не слышно.
    В частности код ieee80211 китайцами "скопирован" из freebsd.
    Это подтверждают и тут: http://bbs.espressif.com/viewtopic.php?f=7&p=2113#p2113
    В итоге особых проблем с WiFi частью быть не должно. Разве что со спецификой, связанной c аппаратными фичами чипа.
    ----
    Ещё пустили байку-слух, что выйдет новый чип ESP с большей памятью. Наверно настолько плохи дела у NodeMCU :)
    Да и пока стало "легче жить" - все "телепузики" ушли на arduino :)
     
    Последнее редактирование: 9 июн 2015
  15. anakod

    anakod Moderator Команда форума

    Сообщения:
    314
    Симпатии:
    100
    Если так, то мне кажется можно взять одну эту функцию бинарником/асмом либо дизассемблировать, а все остальное накатить из оригинала с полными исходниками.
     
  16. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    Да, но там, в оригинале, слишком много лишнего - ~60%. А разбираться с этим лень. Оригинал писало несколько человек и одному разгребать долго.
    Первым делом надо тупо отсортировать, какие функции есть в SDK либе 80211, в каждом входящем obj.
    Код (Text):
    1. libnet80211.a:ieee80211.o
    2. libnet80211.a:ieee80211_action.o
    3. libnet80211.a:ieee80211_crypto.o
    4. libnet80211.a:ieee80211_crypto_ccmp.o
    5. libnet80211.a:ieee80211_crypto_tkip.o
    6. libnet80211.a:ieee80211_crypto_wep.o
    7. libnet80211.a:ieee80211_ets.o
    8. libnet80211.a:ieee80211_hostap.o
    9. libnet80211.a:ieee80211_ht.o
    10. libnet80211.a:ieee80211_hwmp.o
    11. libnet80211.a:ieee80211_input.o
    12. libnet80211.a:ieee80211_mesh.o
    13. libnet80211.a:ieee80211_node.o
    14. libnet80211.a:ieee80211_output.o
    15. libnet80211.a:ieee80211_phy.o
    16. libnet80211.a:ieee80211_power.o
    17. libnet80211.a:ieee80211_proto.o
    18. libnet80211.a:ieee80211_scan.o
    19. libnet80211.a:ieee80211_sta.o
    20. libnet80211.a:if_eagle.o
    21. libnet80211.a:wl_chm.o
    22. libnet80211.a:wl_cnx.o
    Например так:
    https://github.com/pvvx/esp8266web/blob/master/info/libs/net80211/ieee80211_output.h
    Потом надо разгрести форматы запросов и удалить лишнее.
    Затем уже уточненно сравнивать с дизасм, что там китайцы накрутили своего для связи с другими частями и т.д.
    Потом, проанализировав итого, загрузив всё в голову, сесть на попу и переписать исходники из оригинала. :)
     
    Последнее редактирование: 9 июн 2015
  17. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    Вот так делается сохранение всех и каждый раз измененных параметров WiFi в SDK:
    Код (C):
    1.  
    2. void wifi_param_save_protect_with_check(uint16 startsector, int sectorsize, void *pdata, uint16 len)
    3. {
    4.     uint8 * pbuf = pvPortMalloc(len);
    5.     int i;
    6.     if(pbuf == NULL) return;
    7.     do {
    8.         spi_flash_erase_sector(startsector);
    9.         spi_flash_write(startsector*sectorsize, pdata, len);
    10.         spi_flash_read(startsector*sectorsize, pbuf, len);
    11.         i = ets_memcmp(pdata, pbuf, len);
    12.         if(i) {
    13.             os_printf("[W]sec %x error\n", startsector);
    14.         }
    15.     } while(i != 0);
    16.     vPortFree(pbuf);
    17. }
    Т.е. если сектор уже помирает, то оно будет писать "пока дым не пойдет". Китай поражают своим программированием... :)
    При старте модуля (питание, reset, deep_sleep) обычно последний сектор flash стирается и переписывается 2 раза. При соединении к AP тоже стирается и переписывается :mad:
    И делается это (тратится 4 килобайта) для сохранения всего двух контрольных сумм предыдущих 2-х секторов, в которых тоже стираются и переписываются данные до 888 байт...
    Кроме этого в SDK 1.3.0 в некоторых случаях, в процедуре инициализации SDK, стирается и сектор перед сектором с блоком в 128 байт esp_init_data_default.bin (убивает SPIFFS в Дуринах :) ).
    Код (Text):
    1. .irom0.text:40240533                 l32r            a2, a_flashchip
    2. .irom0.text:40240536                 l32i            a2, a2, 0 ;получить адрес структуры flashchip
    3. .irom0.text:40240539                 l32i            a14, a2, 0xC ; flashchip->sector_size (размер сектора = 4096 байт)
    4. .irom0.text:4024053C                 l32i            a2, a2, 4 ; flashchip->chip_size (размер flash в байтах)
    5. .irom0.text:4024053F                 mov.n           a3, a14
    6. .irom0.text:40240541                 l32r            a0, a___udivsi3
    7. .irom0.text:40240544                 callx0          a0 ; a2=a2/a3 =  делить размер flash в байтах на размер сектора
    8. .irom0.text:40240547                 mov.n           a3, a14 ; flashchip->sector_size (размер сектора = 4096 байт)
    9. .irom0.text:40240549                 l32i.n          a4, a1, 0x14 ; адрес блока полученного по pvPortZalloc(256)+0x80 ранее. Туда сохранен блок в 128 байт всех равных 0xFF из сектора с адресом end_flash-0x5000 (=0x7B000).
    10. .irom0.text:4024054B                 addi            a2, a2, -5 ; end flash sectors - 5 !!! (0x7B000 !)
    11. .irom0.text:4024054E                 movi            a5, 0x80 ; 128 байт
    12. .irom0.text:40240551                 call0           wifi_param_save_protect_with_check
    13.  
    :eek:
    Не читайте китайские доки о разметке их Flash с использованием последних 5-ти секторов - там про это ничего не сказано! :)

    Итого на сохранение 888*2+128 байт китай-SDK расходует последние 16 ... , т.е 20 килобайт Flash. :)

    И ошибки во всех версиях SDK в:
    Код (C):
    1. bool wifi_station_set_hostname(uint8 * name)
    2. {
    3.     if(name == NULL) return false;
    4.     uint32 len = ets_strlen(name);
    5.     if(len > 32) return false;
    6.     uint32 opmode = wifi_get_opmode();
    7.     if(opmode == 1 || opmode == 3) {
    8.         default_hostname = false;
    9.         if(hostname != NULL) {
    10.             vPortFree(hostname);
    11.             hostname = NULL;
    12.         }
    13.         hostname = pvPortMalloc(len);
    14.         if(hostname == NULL) return false;
    15.         struct netif * nif = eagle_lwip_getif(0);
    16.         ets_strcpy(hostname, name); // пишется на 1 байт больше, чем было выделено по vPortFree(hostname) !!!
    17.         if(nif != NULL) {
    18.             nif->hostname = hostname;
    19.         }
    20.         return true;
    21.     }
    22.     return false;
    23. }
     
    Последнее редактирование: 10 сен 2015
  18. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    При старте (инициализации SDK) отрабатывает функция phy_gpio_cfg(), которая в качестве исходных опций использует esp_init_data_default.bin байты 50,51,52,53,54,64 и в зависимости от которых она меняет функции GPIO 0,1,2,3,13,14,16 и так-же “SDIO dataoutput is at negative edges (SDIO V1.1)”или “SDIO dataoutput is at positive edges (SDIO V2.0)“ (байт 50) и лезет в неописанные регистры контроллера SDIO (0x60000A00..0x60000Aff).

    Кто копался с этим и может дополнить или уточнить детали с esp_init_data_default.bin и SDIO (0x60000A00..0x60000Aff)?
     
  19. dronvolk

    dronvolk Новичок

    Сообщения:
    2
    Симпатии:
    0
    Похоже тема заглохла... дайте хоть ссылки на описание ассемблера этого чуда в перьях. недавно прикупил себе парочку модулей (да повелся на отношение цена-возможности), а тут sdk наикривейший и нифига описания нет нормального по чипу. придется самому ковырять этот sdk вдруг что получится :D.
     
  20. pvvx

    pvvx Активный участник сообщества

    Сообщения:
    10.314
    Симпатии:
    1.352
    За данное время сменилось много версий SDK и всё что было надо - сделали. Если не знаете где и как взять дизасм, то и браться не стоит :) Берите IDA и вперед.
     

Поделиться этой страницей