Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Зачем NOP перед while() ?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
ISK2010
Использую Keil без оптимизации. При простомотре ассемблера нашел там лишний, на мой взгяд, NOP:

Код
  451:         while(!(*pRXNE)); 

0x080014A8 BF00      NOP; <------ЗАЧЕМ ОН ТУТ?  

0x080014AA F8D6C000  LDR      r12,[r6,#0x00]

0x080014AE F1BC0F00  CMP      r12,#0x00

0x080014B2 D0FA      BEQ      0x080014AA


И так во всех while(). Я не разберусь зачем туда ставит компилятор этот NOP, пока или сам не стану компилятором, или кто-нибудь не скажет зачем.

Палыч
Цитата(ISK2010 @ Oct 7 2010, 11:39) *
Использую Keil без оптимизации.
Это - и есть результат трансляции без оптимизации. Если оптимизация отключена(Level 0) - транслятор тупо использует некие шаблоны для перевода конструкций языка С на ассемблер. Правда, при этом некая "оптимизация" всё же присутствует - именно при этой "оптимизации" NOP'ы и появляются: например, транслятор применил некую команду, но чуть позже заметил, что можно без проблем заменить её другой, выполняющей аналогичное действие, но длина этой другой команды "чуток" короче - команда заменяется, но добавляется NOP (надо думать, чтобы общая длина программы не изменилась rolleyes.gif )...
rezident
Судя по мнемонике у вас какой-то ARM? Если так, то следует напомнить, что у ARM имеется конвейер команд. Видимо компилятор посчитал NOP необходимым для загрузки конвейера при организации такого цикла.
ISK2010
Да, у меня CortexM3 (ST32F105). Я тоже думал про конвеер. А в данном случае этот ноп занимает такт? или нет?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.