реклама на сайте
подробности

 
 
> Вопрос по ARM7 ассемблеру
coolibin
сообщение May 3 2012, 12:31
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



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


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 15)
Lotor
сообщение May 3 2012, 12:42
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(coolibin @ May 3 2012, 16:31) *
подскажите, что делает вот такая команда LDR R2, =0xC00FE1 ? мне с первого взгляда показалось, что в регистр загружается содержимое памяти по адресу 0xC00FE1, но такого адреса нет.

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


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 3 2012, 12:44
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Это псевдокоманда загрузки константы в регистр (т.е. она загрузит в R2 число 0xC00FE1).
На деле же ассемблер заменяет её на LDR R2, [PC, #xx].
Go to the top of the page
 
+Quote Post
R.A.K.
сообщение May 3 2012, 12:45
Сообщение #4


Участник
*

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180



Цитата(coolibin @ May 3 2012, 16:31) *
подскажите, что делает вот такая команда LDR R2, =0xC00FE1 ? мне с первого взгляда показалось, что в регистр загружается содержимое памяти по адресу 0xC00FE1, но такого адреса нет.


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


Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 3 2012, 12:51
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
coolibin
сообщение May 3 2012, 13:15
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



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


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 3 2012, 13:24
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(coolibin @ May 3 2012, 17:15) *
что заместо хх ставить?

Смещение относительно текущего адреса инструкции с учетом конвейера (т.е. на деле PC указывает на 2 инструкции вперед относительно текущей).
Но лучше пусть ассемблер ставит.
Go to the top of the page
 
+Quote Post
coolibin
сообщение May 3 2012, 14:08
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



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


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
R.A.K.
сообщение May 3 2012, 14:14
Сообщение #9


Участник
*

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180



Цитата(coolibin @ May 3 2012, 17:15) *
дело в том, что про псевдо инструкции я читал, но я так и не понял что к чему) может кто нибудь объяснить т. с. на пальцах, что все таки делает данная инструкция? LDR R2, [PC, #xx] что заместо хх ставить?


Загрузить в регистр константу можно двумя способами:
1. Командой MOV
2. Командой LDR

Одной командой MOV загрузить любое значение нельзя. Можно только такое, которое получается циклическим сдвигом любой 8-ми разрядной константы вправо на четное число бит.
Если этого сделать нельзя - можно загрузить константу в несколько приемов (MOV + еще какая-нибудь data-processing команда с еще одним непосредственным операндом).
Либо можно разместить константу (в секции DATA), недалеко от текущего кода, и загружать ее в регистр командой LDR, используя в качестве базовой части адреса текущее значение PC(R15), а смещение задавая непосредственным операндом.

Чтобы избавить программиста от этого геморроя, введена псевдо-команда LDR. Программист просто указывает, что необходимо загрузить в регистр такую-то константу. Программа-ассемблер сама по ходу дела решает как это лучше сделать - через MOV или через LDR (вместо псевдо-каманды вставляет подходящую инструкцию, если надо LDR - добавляет константу в секцию DATA).
Go to the top of the page
 
+Quote Post
SII
сообщение May 3 2012, 15:47
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



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

Цитата(coolibin @ May 3 2012, 18:08) *
честно, я вообще ничего не пойму)) давайте по порядку, я в иде дизассемблировал прошивку проца аля ARM7TDMI, обнаружил кучу инструкций типа LDR R2, =0xC00FE1, меня интересует, что будет происходить в результате выполнения именно этой команды? в R2 будет загружено число 0xC00FE1? или число по несуществуещему адресу 0xC00FE1? или еще что то? я буду оч благодарен если кто нибудь популярно объяснит))


Будет загружено указанное число.
Go to the top of the page
 
+Quote Post
coolibin
сообщение May 4 2012, 08:04
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



вот сейчас все более менее понятно, благодарю!
у меня еще один вопрос, есть код:

Код
LDR     R1, =0xC0228C
LDRB    R0, [R1]


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


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 4 2012, 08:22
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(coolibin @ May 4 2012, 12:04) *
может ли это быть связано, например, с внешним eeprom?

Вряд ли. Вы бы название процессора огласили, код которого разбираете.
Go to the top of the page
 
+Quote Post
coolibin
сообщение May 4 2012, 10:07
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



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

Сообщение отредактировал coolibin - May 4 2012, 10:09


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 4 2012, 10:14
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Да, это RAM.
Go to the top of the page
 
+Quote Post
coolibin
сообщение May 4 2012, 12:25
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



спасибо!


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
SII
сообщение May 4 2012, 20:42
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414



Цитата(coolibin @ May 4 2012, 12:04) *
Код
LDR     R1, =0xC0228C
LDRB    R0, [R1]


я так понимаю здесь загружаеться в переменную R0 один байт хранящийся по адресу 0xC0228C


Только не в переменную, а в регистр. Переменных в том строгом смысле, какой используется в языках высокого уровня, на уровне команд процессора (и соответственно, в языке ассемблера) нет.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th June 2025 - 07:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01471 секунд с 7
ELECTRONIX ©2004-2016