Как работает БД? Разве не байты кода вывода ассемблера?

Что я изучил до сих пор, так это то, что мы пишем программу на языке ассемблера... передаем эту программу ассемблеру, который генерирует машинный код... передаем машинный код в устройство записи ПЗУ, которое записывает его в ПЗУ микроконтроллера

Теперь мой вопрос связан с такими директивами, как DB, используемыми для определения байтов данных.

Как эта директива не будет генерировать машинный код? Чтобы поместить байт в память, должен быть какой-то код ... это не может произойти волшебным образом

Эта директива должна будет сгенерировать что-то, что позже сообщит программе записи ПЗУ, что этот байт данных должен быть помещен по этому адресу.

Помогите пожалуйста я вся в замешательстве


person Bisma    schedule 08.08.2020    source источник
comment
Как эта директива не будет генерировать машинный код? Чтобы поместить байт в память, должен быть какой-то код ... это не может произойти волшебным образом - db не генерирует машинный код, если только данные, которые вы указываете, не являются машинным кодом. Подобно инструкции, данные db записываются в выходной файл.   -  person ecm    schedule 08.08.2020
comment
БД не генерирует инструкции для записи в память во время выполнения. Вместо этого он помещает байты в «поток инструкций». Программа загружается (например, операционной системой) в память при запуске. Затем также загружаются данные БД. Либо вы помещаете закодированные инструкции с помощью db, либо следите за тем, чтобы данные, сгенерированные с помощью db, никогда не выполнялись, например. поместив данные в конец программы или поместив инструкцию перехода перед db   -  person Sebastian    schedule 15.08.2020


Ответы (2)


Вы правы, псевдоинструкция БД принципиально не отличается от других инструкций. Оба просто выдают несколько байтов на выходе в текущей позиции.

DB — это удобный способ вывода байтов, которые ваша программа не выполняет в виде кода. Мы называем это данными. Вы делаете это, помещая данные по адресу, который выполнение никогда не достигнет (например, потому что вы не прыгаете и не проваливаетесь туда).

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

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

(В реальной жизни гарвардские машины, такие как микроконтроллеры AVR, обычно копируют часть программной памяти (ПЗУ) в ОЗУ при запуске, чтобы инициализировать статические переменные данных для чтения и записи, и даже имеют инструкцию загрузки программной памяти, чтобы вы могли иметь постоянные таблицы поиска в ПЗУ. Таким образом, у вас все еще будут некоторые db данные рядом с кодом.)

Связанные вопросы и ответы, в которых упоминаются инструкции по кодированию вручную с помощью DB (для x86, но концепция одинакова для любой ISA):

person Peter Cordes    schedule 08.08.2020

Все программы требуют данные:

  • небольшие константы, такие как 1, обычно могут быть встроены в инструкции машинного кода, которые их используют
  • большие константы иногда не соответствуют форме машинного кода, поэтому они входят в данные и на них ссылается код.
  • программы часто используют строковые литералы для имен файлов и путей, подсказок и т. д.
  • буферы хранения как пространство для чтения пользовательского ввода или из файла
  • глобальные переменные, инициализированные нулем или другим
  • константы с плавающей запятой помещаются в память, поскольку они обычно слишком велики, чтобы соответствовать непосредственно инструкции машинного кода.

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

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

Если вы пометите данные, вы можете использовать (сделать ссылку) эту метку из своего кода и данных.

У большинства ассемблеров также есть понятие отдельных разделов кода и данных. Директива .data (или что-то другое, подходящее для этого ассемблера) укажет ассемблеру собирать последующие объявления данных вместе в раздел данных выходных данных ассемблера и компоновщика. Обычно в исходном коде сборки мы можем переключаться между разделами кода и данных, чтобы хранить данные, относящиеся к коду, поблизости в исходном коде, но, возможно, собранные отдельно в сконструированном программном файле в соответствии с тем, как определены программные файлы.

person Erik Eidt    schedule 08.08.2020