From 5f357fdd7ebcdfb189590311165745d93ad9b487 Mon Sep 17 00:00:00 2001 From: markast555 Date: Sat, 7 Jun 2025 00:58:13 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B2=2014=20=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=BD=D0=BE=D0=B9=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit К прошлым изменениям (Старые названия модулей) забыл добавить, что в Labs/07. Datapath/board files /README.md на рисунке 1 тоже старые названия модулей. В листинге 1 написано:".../* Секция данных размещается аналогично секции инструкций за исключением адреса загрузки в памяти (Load Memory Address, LMA). Поскольку память инструкций и данных физически разделены, у них есть пересекающееся адресное пространство, которое мы бы хотели использовать (поэтому в разделе MEMORY мы указали что стартовые адреса обоих памятей равны нулю). Однако компоновщику это не нравится, ведь как он будет размещать две разные секции в одно и то же место. Поэтому мы ему сообщаем, с помощью оператора "AT", что загружать секцию данных нужно на самом деле не по нулевому адресу, а по какому-то другому, заведомо большему чем размер памяти инструкций, но процессор будет использовать адреса, начинающиеся с нуля. Такой вариант компоновщика устраивает и он собирает исполняемый файл без ошибок. Наша же задача, загрузить итоговую секцию данных по нулевым адресам памяти данных. */ .data : AT (0x00800000) {..." --- Labs/14. Programming/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Labs/14. Programming/README.md b/Labs/14. Programming/README.md index ad52c32..1d95e00 100644 --- a/Labs/14. Programming/README.md +++ b/Labs/14. Programming/README.md @@ -96,7 +96,7 @@ _Таблица 1. Ассемблерные мнемоники для целоч Обычно LMA совпадает с VMA. Однако в некоторых случаях они могут быть и различны (например, изначально секция данных записывается в ROM, а перед выполнением программы, копируется из ROM в RAM). В этом случае, LMA — это адрес секции в ROM, а VMA — адрес секции в RAM. -Таким образом, мы можем сделать общие VMA (процессор, обращаясь к секциям инструкций и данных будет использовать пересекающееся адресное пространство), а конфликт размещения секций компоновщиком разрешить, задав какой-нибудь заведомо большой VMA для секции данных. В последствии, мы просто проигнорируем этот адрес, проинициализировав память данных начиная с нуля. +Таким образом, мы можем сделать общие VMA (процессор, обращаясь к секциям инструкций и данных будет использовать пересекающееся адресное пространство), а конфликт размещения секций компоновщиком разрешить, задав какой-нибудь заведомо большой LMA для секции данных. В последствии, мы просто проигнорируем этот адрес, проинициализировав память данных начиная с нуля. Помимо прочего, в скрипте компоновщика необходимо прописать, каков [порядок следования байт](https://en.wikipedia.org/wiki/Endianness), где будет находиться стек, и какое будет значение у указателя на глобальную область памяти.