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

Вопрос по ARM7 ассемблеру

подскажите, что делает вот такая команда LDR R2, =0xC00FE1 ? мне с первого взгляда показалось, что в регистр загружается содержимое памяти по адресу 0xC00FE1, но такого адреса нет.

Поделиться сообщением


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

подскажите, что делает вот такая команда LDR R2, =0xC00FE1 ? мне с первого взгляда показалось, что в регистр загружается содержимое памяти по адресу 0xC00FE1, но такого адреса нет.

В регистр загружается именно значение, почитайте тут например.

Поделиться сообщением


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

Это псевдокоманда загрузки константы в регистр (т.е. она загрузит в R2 число 0xC00FE1).

На деле же ассемблер заменяет её на LDR R2, [PC, #xx].

Поделиться сообщением


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

Гость tolikpuhovich
подскажите, что делает вот такая команда LDR R2, =0xC00FE1 ? мне с первого взгляда показалось, что в регистр загружается содержимое памяти по адресу 0xC00FE1, но такого адреса нет.

 

Почитайте в руководстве на среду, в которой работаете, про assemler pseudo-instructions.

 

 

 

Поделиться сообщением


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

А если операнд будет "в ширину", то в R2 загрузится значение по адресу, значение которого равно адресу)

Поделиться сообщением


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

дело в том, что про псевдо инструкции я читал, но я так и не понял что к чему) может кто нибудь объяснить т. с. на пальцах, что все таки делает данная инструкция? LDR R2, [PC, #xx] что заместо хх ставить?

Поделиться сообщением


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

что заместо хх ставить?

Смещение относительно текущего адреса инструкции с учетом конвейера (т.е. на деле PC указывает на 2 инструкции вперед относительно текущей).

Но лучше пусть ассемблер ставит.

Поделиться сообщением


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

честно, я вообще ничего не пойму)) давайте по порядку, я в иде дизассемблировал прошивку проца аля ARM7TDMI, обнаружил кучу инструкций типа LDR R2, =0xC00FE1, меня интересует, что будет происходить в результате выполнения именно этой команды? в R2 будет загружено число 0xC00FE1? или число по несуществуещему адресу 0xC00FE1? или еще что то? я буду оч благодарен если кто нибудь популярно объяснит))

Поделиться сообщением


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

Гость tolikpuhovich
дело в том, что про псевдо инструкции я читал, но я так и не понял что к чему) может кто нибудь объяснить т. с. на пальцах, что все таки делает данная инструкция? LDR R2, [PC, #xx] что заместо хх ставить?

 

Загрузить в регистр константу можно двумя способами:

1. Командой MOV

2. Командой LDR

 

Одной командой MOV загрузить любое значение нельзя. Можно только такое, которое получается циклическим сдвигом любой 8-ми разрядной константы вправо на четное число бит.

Если этого сделать нельзя - можно загрузить константу в несколько приемов (MOV + еще какая-нибудь data-processing команда с еще одним непосредственным операндом).

Либо можно разместить константу (в секции DATA), недалеко от текущего кода, и загружать ее в регистр командой LDR, используя в качестве базовой части адреса текущее значение PC(R15), а смещение задавая непосредственным операндом.

 

Чтобы избавить программиста от этого геморроя, введена псевдо-команда LDR. Программист просто указывает, что необходимо загрузить в регистр такую-то константу. Программа-ассемблер сама по ходу дела решает как это лучше сделать - через MOV или через LDR (вместо псевдо-каманды вставляет подходящую инструкцию, если надо LDR - добавляет константу в секцию DATA).

 

Поделиться сообщением


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

LDR -- не псевдокоманда, не вводите народ в заблуждение. Это самая что ни на есть обычная команда, загружающая в регистр содержимое некоторой ячейки памяти. Запись же вида LDR R0, =1234 говорит транслятору ассемблера, что надо где-то в памяти выделить местечко под константу 1234, а здесь обеспечить её загрузку в R0. Сама же команда в действительности примет вид LDR R0, [PC, #смещение], где смещение вычисляется, исходя из адреса этой команды и адреса константы. При выполнении процессор прибавит к текущему значению PC значение смещения, после чего прочитает из памяти слово, лежащее по получившемуся адресу, и занесёт его в R0.

 

честно, я вообще ничего не пойму)) давайте по порядку, я в иде дизассемблировал прошивку проца аля ARM7TDMI, обнаружил кучу инструкций типа LDR R2, =0xC00FE1, меня интересует, что будет происходить в результате выполнения именно этой команды? в R2 будет загружено число 0xC00FE1? или число по несуществуещему адресу 0xC00FE1? или еще что то? я буду оч благодарен если кто нибудь популярно объяснит))

 

Будет загружено указанное число.

Поделиться сообщением


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

вот сейчас все более менее понятно, благодарю!

у меня еще один вопрос, есть код:

 

LDR     R1, =0xC0228C
LDRB    R0, [R1]

 

я так понимаю здесь загружаеться в переменную R0 один байт хранящийся по адресу 0xC0228C. только такого адреса нет в программе и переферия имеет немного другие адреса? как это можно объяснить? может ли это быть связано, например, с внешним eeprom?

Поделиться сообщением


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

может ли это быть связано, например, с внешним eeprom?

Вряд ли. Вы бы название процессора огласили, код которого разбираете.

Поделиться сообщением


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

точно не помню, помоему этот - http://www.chipfind.ru/datasheet/micronas/cdc3272gc.htm из диаграммы я понял, что это RAM, но я могу ошибаться

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

Поделиться сообщением


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

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

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

×
×
  • Создать...