От новичка до гуру: Курсы программирования на CyberDuff

Каково значение счетчика программ при использовании их в инструкции? (Сборка)

В настоящее время у меня есть небольшая (ARM Cortex M4) программа сборки, выдержка, по которой у меня есть вопрос, приведена ниже:

PC    Instruction
0x9c  MOV    R0, #0
0x9e  LDR.N  R1, [PC, #0x20]
0xa0  STR.N  R0, [R1]

Во второй строке PC = 0x9e. Но какое значение имеет доступ к ПК в качестве одного из операндов? 0x9e или 0xa0?

22.04.2015

  • Разве вы не можете сделать что-то вроде beq, чтобы проверить это? 23.04.2015
  • @mstbaum Этот код является переведенной версией моего кода C, я не думаю, что могу изменить какой-либо код сборки, но я пытаюсь понять его. 23.04.2015
  • Технически он имеет значение 0xa2 согласно руководству: Значение ПК будет на 4 байта больше, чем адрес этой инструкции. Однако будьте осторожны, потому что ваш дизассемблер мог уже компенсировать это. Возможно, вы захотите проверить машинный код. 23.04.2015
  • @Jester Как 0x9e + 4 байта = 0xa2? 23.04.2015
  • возможный дубликат о значении ПК руки в большом пальце 16 /32-битный смешанный поток инструкций или, может быть, понимание природы регистра ПК ARM или другие... 23.04.2015
  • @Jester, хотя, конечно, значение эффективного в этом случае (в качестве базового регистра в режиме адресации) равно (0x9e + 4) & (~3) == 0xa0. Вот почему я всегда рад, что разборка objdump включает комментарий с конечным адресом... 23.04.2015
  • @Notlikethat, что заставляет тебя так думать? Я не согласен. О, ты имеешь в виду это? bit 1 of the PC is forced to 0 to ensure it is word aligned. 23.04.2015
  • @Jester действительно, именно так литеральные формы Thumb ldr/str/adr получают диапазон смещения от +0 до +1020 всего из 8 битов кодирования (в противном случае вы бы потратили бит только на компенсацию выравнивания инструкций и получили бы только половину эффективный диапазон, еще в v4, когда доступ к невыровненным словам был бессмысленным в любом случае) 23.04.2015

Ответы:


1

Отображаемые значения ПК почти наверняка не являются абсолютными. Обычно они относятся к началу модуля.

Разные версии ARM по-разному ведут себя при чтении с ПК. Ранние версии имеют значение, эквивалентное 0x9e. Более поздние версии имеют значительный «упреждающий просмотр», поэтому они имеют значения 0xa0 или выше. То есть к моменту выборки ПК он уже выполнил дальнейшую последовательность для получения следующей инструкции (инструкций). Поражено, потому что @Notlikethat нашел ссылку 1985 года, в которой говорится, что все они имеют +8 продвинутых.

Таким образом, второй операнд-источник инструкции PC, #0x20 добавляет 32 к значению ПК, но ПК имеет абсолютный адрес (примерно) того места, где находится инструкция, который может быть перемещен на миллионы байтов выше 0x9e.

22.04.2015
  • Второй абзац неверный. Значение в r15 всегда представляет собой текущую инструкцию + 8 байтов в состоянии ARM и текущую инструкцию + 4 байта в состоянии Thumb. Использование PC в качестве базового регистра для адресации добавляет тонкости выравнивания значения по словам, а адреса возврата исключений становятся немного странными, но чтение PC всегда представляло собой выборку на две инструкции вперед. 23.04.2015
  • @Notlikethat: я удалил нечетный адрес, но я не думаю, что это всегда + 8 без большого пальца. Я почти уверен, что на ARM 1 (и, возможно, 2) это ПК + 0. 23.04.2015
  • @Notlikethat: В другом ответе насколько вы уверены, что оригинальный ARM предоставил PC+8? 23.04.2015
  • раньше было +8 для руки и +4 для большого пальца, проблема в thumb2, правильный ответ теперь на две инструкции вперед, сколько бы байтов это ни было... Правда, внутренний канал намного глубже и варьируется от одной архитектуры или ядра к другие, но они подделывают двух впереди всех. 23.04.2015
  • да, armv4 и последующие 32 бита — это два впереди, я не знаю, что было до armv4 (просто поищите) или 64-битный набор инструкций, который переделывается. 23.04.2015
  • Ну, я нигде не могу найти упоминания об обратном — самая старая официальная вещь, к которой у меня есть доступ, — это руководство по ARM6 от 1993 года, и это, безусловно, говорит о том, что ПК на два слова впереди. Учитывая, что 3-этапный конвейер был с самого начала, я не понимаю, почему они добавили такую ​​причуду позже. Кроме того, кто в наши дни изучает ассемблер на Archimedes, и кто, кроме Acorn, хоть раз приближался к ARM1? 23.04.2015
  • Нет, подождите... Руководство по программному обеспечению ЦП Acorn RISC Machine, выпуск 1.00, 1985 г., все 27 страниц, потрясающе! Смещение ветвления должно учитывать операцию предварительной выборки, которая приводит к тому, что ПК опережает текущую инструкцию на 2 слова. ... ПРИМЕЧАНИЕ, если Rn равно R15, ассемблер вычтет 8 из значения смещения, чтобы иметь дело с конвейерной обработкой ARM. - оказывается, я чрезвычайно уверен ;) 23.04.2015
  • @Notlikethat: Спасибо, что нашли это. Я обновил свой ответ. 23.04.2015
  • Новые материалы

    Представляем Narwhal Technologies (Nrwl)
    6 декабря 2016 г. Маунтин-Вью, Калифорния С тех пор, как Виктор Савкин и я (Джефф Кросс) присоединились к команде Angular в Google на заре Angular 1, Angular продемонстрировал феноменальный..

    Путь AWS  — «Изучение машинного обучения — 10 начинающих ИИ и машинного обучения на AWS».
    Универсальный ресурсный центр для изучения искусственного интеллекта и машинного обучения. НОЛЬ или ГЕРОЙ, начните свое путешествие здесь. Получите решения и пройдите обучение у экспертов AWS...

    5 простых концепций Python, ставших сложными
    #заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

    «Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
    Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

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


    © 2024 cyberbuff.ru, От новичка до гуру: Курсы программирования на CyberDuff