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

Как написать в ассемблере переход без меток?


oleg st

Рекомендуемые сообщения

Да, конечно оговорился, просто со словом пеньки у любой intel того далёкого времени на базе х86 ассоциируется :crazy:

Изменено пользователем AvrAsm
Ссылка на комментарий
Поделиться на другие сайты

11.07.2020 в 16:06, oleg st сказал:

я перешел на си, писал выше, но на асме пишу под мелкие мк типа тини13/10, и благодаря этому переходу мой асм стал лучше :D

Начали активно макросы применять? Или что-то другое? 

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

8 часов назад, AvrAsm сказал:

Начали активно макросы применять? Или что-то другое? 

Когда расширяется инструментарий, уже видишь другие подходы написания, алго да и макросы помогают. Век живи век учись ))

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Наиболее полезный макрос я в своё время делал с помощью добрых людей с форума Электроникс, и макрос этот был для avr-as из комплекта avr-gcc (WinAVR). В том убожище, которое avrassember от Atmel, макросы - это недоразумение...

Так вот, в "нормальном" ассемблере я сделал пару макросов, функционально напоминающих пару команд ассемблера x86 ENTER - LEAVE. Макрос ENTER в качестве параметров принимает любое количество регистров в виде списка, которые сохраняет в стек, а макрос LEAVE уже без параметров восстанавливает эти самые регистры из стека в нужном порядке - очень удобно при написании обработчиков прерываний. А лучшего применения макросов я и не припоминаю... 

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

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Только что, oleg st сказал:

стековые вспомнил для авр

Главна проблема при работе со стеком - это не нарушить порядок сохранения-восстановления регистров (или пар). И макрос pushw никак эту проблему не решает: написать на входе в обработчик прерывания

pushw r24
pushw r26

и потом по запарке на выходе 

popw r24
popw r26

проще простого... Упомянутые мной макросы лишены этого недостатка, и используются как-то так:

ENTER r0, r7, r12, r30
; обработчик
LEAVE
reti

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

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

ENTER r0, r7, r12, r30
; обработчик
LEAVE
reti

А как LEAVE знает нужную последовательность восстанавливаемых регистров?

ENTER где-то как-то сохраняет строку входных регистров? :shok:

А дайте ссылку на тему на электрониксе.

 

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

Это было очень давно, и ссылку я не найду... А вот ссылку на свою статью по поводу этого макроса, могу дать. Правда, там сменился движок и верстка статьи съехала, вставки кода никак не выделены, но смысл понять можно. 

https://simple-devices.ru/articles/7-soft/170-gnu-assembler-reviev

44 минуты назад, oleg st сказал:

накрутить можно как угодно

Это да, но только не в атмеловском ассемблере! Нормальный макроассемблер - это, имхо, gnu-as или GAS

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Ну, здравствуйте... Вы что, никогда с макроассемблером дел не имели? Это переменная, существующая только для макроассемблера, она нигде не хранится, кроме как в памяти компилятора.

Когда в Си вы пишите #define DELTA 12 - где хранится DELTA? Вот и selector там же...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Ну чего Вы сразу "здравствуйте"??? Я просто уточнил.

А если мне в прерывании на входе надо запомнить в стеке всего несколько регистров минимально необходимых.

А затем надо еще регистров в стек добавить.

А это уже два ENTERа будет без LEAVE между ними.

Как быть?

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

Только что, AvrAsm сказал:

Ну чего Вы сразу "здравствуйте"???

Прошу прощения... позволил лишнего.

Только что, AvrAsm сказал:

А если мне

Придумать кучу всяких "а если" можно на любое количество "вот так". Поэтому у меня ответа нет: упомянутые макросы работают в паре, и до использования LEAVE нового ENTER быть не должно. При известном напряжении мозга можно придумать что-то и на этот случай, но лично я не вижу необходимости. Чаще всего при входе в функцию или обработчик прерываний сразу сохраняют все, что нужно, и потом уже не добавляют. В конце концов, push-pop в вашем распоряжении всегда.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Только что, AvrAsm сказал:

Зачем такой макрос нужен?

Разве я недостаточно описал, зачем?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

1 минуту назад, ARV сказал:

Придумать кучу всяких "а если" можно

Я ничего не придумывал. Для меня такое сохранение регистров в прерывании вполне норма.

Зачем сохранять регистры которые могут не понадобиться в обработчике, а могут и понадобиться.

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

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

Только что, AvrAsm сказал:

Зачем сохранять регистры которые могут не понадобиться в обработчике, а могут и понадобиться.

Когда вы пишите обработчик прерывания, вы все равно некоторое количество регистров сохраняете в стеке (ну, простейшие случаи не берем в расчет). Следовательно, хотя бы ENTER r1, r2 у вас на входе в обработчик будет. В конце будет LEAVE.

В процессе вам может не хватить пары этих регистров, и тогда вы запросто допишите в ENTER еще несколько: ENTER r1, r2, r16, r17. Потом выяснится, что r16 у вас занят в другой части проекта и использовать его нежелательно, и вы просто замените его на другой ENTER r1, r2, r24, r17. А потом выясните, что можно оптимизировать и отказаться от r1 - и вы просто удалите его из списка: ENTER r2, r24, r17. При этих манипуляциях вам никогда не придется переживать, в каком порядке и какие именно регистры восстанавливаются при выходе из обработчика! Вот в чем смысл этих макросов.

Поскольку на ассемблере обработчик прерывания может занимать легко пару-тройку экранов кода, без этих макросов уследить за корректной цепочкой pop (на 348-й строке) сложновато, так как цепочка push у вас на 1-й строке...

Принцип, как в Си с локальными переменными: в начале вы их определили, но при выходе из функции они сами уничтожились. Аналогия притянутая, но, по-моему, нормально демонстрирует удобство.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

1 минуту назад, ARV сказал:

Вот в чем смысл этих макросов.

Да понял я смысл.

Это Вы не поняли то что я написал.

И почему возникает необходимость добавления сохраняемых в стек регистров во время выполнения программы обработчика.

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

--------

Ассемблер на то и ассемблер и не терпит вольностей. Пишешь на асме будь добр считай все PUSH и POP и контролируй их последовательность!

Не хочешь этим заниматься - пиши на СИ и пр.

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

Только что, AvrAsm сказал:

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

И что? По-моему, сохранять неожиданно потребовавшиеся регистры в середине обработчика, а не в начале, плохой стиль (если, конечно, в этом нет какого-то особого тайного смысла). А в начале вам заранее ничего знать и не надо - там пишите себе, когда хотите и что хотите, и не бойтесь, что при выходе что-то напортачите.

Макросы, как простая автозамена - это разве польза? Современный редактор (даже тупейший "блокнот") легко заменит любой текст на несколько новых строк - в чем удобство для программиста? По-моему, удобство именно в том и заключается, чтобы облегчать жизнь - разве отсутствие необходимости следить за pop-ами в конце обработчика не облегчение?

Но дело ваше - не нравится, не применяйте. Моё дело маленькое - своими предпочтениями поделился, и с меня хватит.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

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

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

Неужели? :D

А тайный смысл конечно есть, это сокращение времени обработки прерывания.

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

Сокращайте на здоровье! И простите, что вынудил вас потратить столько времени на изучение абсолютно ни на что не годных макросов.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Да бросьте. Мне не жаль абсолютно. Всегда интересно и полезно что-то новое узнать.

А макросы ваши удобны новичкам. Хотя новичков пишущих на асме уже наверное и не будет никогда.

Но для "суровых челябинцев" эти макросы бесполезны, уж извините, пишу что думаю не люблю лукавить.

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

Вам остается еще сказать, что код вы пишите в VIM-е, и я буду раздавлен вашим челябинским программированием окончательно.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • Когда снова появился интерес к усилителям, тоже хотел всех обмануть, попробовал 7294 в разных схемах, 3886 тоже несколько способов приготовления, вроде и неплохо играет, если ничего другого не слушал, годится. Но червячок сподвиг сделать Натали Хоум, УХ! челюсть отвисла, наслушаться не мог, узнал, что такое сцена в звуке, динамика, детальность, да всё лучше. Вот я всегда и спрашиваю, по сравнению с какими другими УМ играет хорошо расхваливаемый усилитель.
    • @Armenn Хорошо. Сделал резистор на 5 Ом.  Результата два. 1. Если включить блок питания в сеть, а уже потом подключить резистор на 5 Ом в фиолетовый провод, тогда резистор просто будет греться.  2. Если подключить резистор на 5 Ом в фиолетовый провод, а уже потом включить блок питания в сеть, тогда случится следующее: лампочка предохранителя от КЗ засветится (через которую я подключаю БП в сеть), а блок питания начнет пищать. Заснял это на видео -   
    • Ну-вы и сравнили. Вот когда будете строить сварочный инвертор на такую частоту-то там нужно  будет учитывать скин эффект. А на частоты до 75кгц-можно забить, отбить и не принимать во внимание. Тем более-что все стараются аппараты до 200А строить. На кольце плотность тока до 15А на мм ^2, на Ш от 10А на  мм^2 А вентилятор-он все лишние тепло сдует ко льдам в Антарктиде. Проверьте монолит 2,12мм, я таким мотаю СТ. Интересно-что там с ним делается на частотах от 30 до 50кГц? Длинна провода примерно 2 метра-На сердечник Е70 влазит 18 витков
    • Добрый вечер всем!  Проблема следующая: Есть флешка с записанной файловой системой через USB MASS STORAGE DEVICES. При "втыкании"  в порт USB открывается на ПК диск с содержимым. Я подключил библиотеку Fatfs и прописал низкоуровневые функции чтения и записи в файле diskio.c Работаю с файлом так:   disk_initialize(SDFatFs.drv); if(f_mount(&SDFatFs,(TCHAR const*)USER_Path,0)!=FR_OK) { //Error_Handler(); Usart1_Send_String("Error_f_mount!\r\n"); } else { if(f_open(&MyFile,"01.WAV",FA_READ)!=FR_OK) { //Error_Handler(); Usart1_Send_String("Error_open_File1!\r\n"); } else { Usart1_Send_String("open_File_OK1!\r\n"); } if(f_open(&MyFile,"01.wav",FA_READ)!=FR_OK) { //Error_Handler(); Usart1_Send_String("Error_open_File2!\r\n"); } else { Usart1_Send_String("open_File_OK2!\r\n"); UINT testBytes=0; f_read(&MyFile, buff1, 512, &testBytes); sprintf(buf1, "TestBytes=%d\r\n", testBytes); Usart1_Send_String(buf1); Usart1_Send_hex((char*)buff1, 512); Usart1_Send_String("read_File_complite!\r\n"); f_close(&MyFile); } } подправил diskio.c так:   DRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address in LBA */ UINT count /* Number of sectors to read */ ) { DRESULT res; //res = disk.drv[pdrv]->disk_read(disk.lun[pdrv], buff, sector, count); sprintf(buffer0, "sector=%lu\r\n", sector); Usart1_Send_String(buffer0); w25qReadPage(buff, sector*2); w25qReadPage(buff + 256, sector*2+256); res=RES_OK; return res; } #if _USE_WRITE == 1 DRESULT disk_write ( BYTE pdrv, /* Physical drive nmuber to identify the drive */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address in LBA */ UINT count /* Number of sectors to write */ ) { DRESULT res; //res = disk.drv[pdrv]->disk_write(disk.lun[pdrv], buff, sector, count); w25qWritingByUSB(sector, (uint8_t*)buff); res=RES_OK; return res; } #endif /* _USE_WRITE == 1 */ функцию чтения на самом деле пробовал прописывать по разному, все равно не корректно работает... Выдает в отладке такое:   Program start!.... sector=0 // это обращение к функции чтения DRESULT disk_read (); Error_open_File1! sector=0 // это обращение к функции чтения DRESULT disk_read (); Error_open_File2! Что я забыл еще добавить?
    • В былые годы запрещалось размещать на форуме бессмысленные темы. Видать, с тех пор правила существенно изменились.
    • скачай новый архив. там есть важные изменения в комповой программе, по сравнению с той, что я отправлял в личке. исправлены недоделки и добавлены проверки на некорректные действия.
×
×
  • Создать...