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

Передача константного значения в указатель.

1 hour ago, gerber said:

В опкоде инструкции же, это и есть immediate value.

да но физически где оно находиться? не в редакторе, в контролере.

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


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

19 минут назад, jenya7 сказал:

да но физически где оно находиться? не в редакторе, в контролере.

Мне одному кажется, что на форуме не хватает раздела: "Хохмы нашего форума?"  :biggrin:

Я даже знаю кто там будет самым активным автором.  :biggrin::biggrin::biggrin:

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


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

12 минут назад, jenya7 сказал:

да но физически где оно находиться? не в редакторе, в контролере.

В теле опкода инструкции, например, из 32-бит опкода часть бит (например, 12 бит) может быть выделено под immediate value, в этом случае с помощью такой инструкции можно работать с константным числом от 0 до 4095, или -2048...2047, если трактуется как знаковое число.

В тех архитектурах или режимах, где инструкции короткие, скажем, 16-битные, под immediate value может быть выделено совсем мало бит, в этом случае такие инструкции используются в совсем простых случаях, скажем, для инкремента (a++). В остальных случаях используется смещение относительно PC, и константа забирается с адреса, лежащего в окрестностях  текущего выполнения кода.

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


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

2 hours ago, gerber said:

В теле опкода инструкции, например, из 32-бит опкода часть бит (например, 12 бит) может быть выделено под immediate value, в этом случае с помощью такой инструкции можно работать с константным числом от 0 до 4095, или -2048...2047, если трактуется как знаковое число.

В тех архитектурах или режимах, где инструкции короткие, скажем, 16-битные, под immediate value может быть выделено совсем мало бит, в этом случае такие инструкции используются в совсем простых случаях, скажем, для инкремента (a++). В остальных случаях используется смещение относительно PC, и константа забирается с адреса, лежащего в окрестностях  текущего выполнения кода.

а как константа связанна с командой? как инструкция знает что именно этой константой нужно оперировать?

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


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

10 минут назад, jenya7 сказал:

а как константа связанна с командой? как инструкция знает что именно этой константой нужно оперировать?

Дык на то и опкод, по которому процессор декодирует инструкцию. После декодирования опкода процессор "понимает", что это, к примеру, MOV Rx, #immediate, пересылка immediate value в регистр, в этом случае, часть бит интерпретируется как номер регистра-приемника, а часть бит как собственно immediate value.

Другой опкод будет по-другому интерпретировать биты инструкции, и вместо immediate value там окажется, к примеру, смещение относительной адресации.

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


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

1 hour ago, gerber said:

Дык на то и опкод, по которому процессор декодирует инструкцию. После декодирования опкода процессор "понимает", что это, к примеру, MOV Rx, #immediate, пересылка immediate value в регистр, в этом случае, часть бит интерпретируется как номер регистра-приемника, а часть бит как собственно immediate value.

Другой опкод будет по-другому интерпретировать биты инструкции, и вместо immediate value там окажется, к примеру, смещение относительной адресации.

понял. спасибо.

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


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

12 hours ago, jenya7 said:

Есть структура с указателями на переменные


typedef struct
{
    void *l_var; 
    void *r_var;   
}IN_EXPR;

IN_EXPR expression;

А если я хочу значение указателя инициализировать константой?

expression.l_var = (void*)100;

 

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


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

18 hours ago, dimka76 said:

expression.l_var = (void*)100;

Автор хочет не этого.

Прочитайте в заглавном посте самый конец. Ему не важно значение адреса, которым инициализируется указатель (у вас это 100). Важно, чтобы по этому адресу лежало конкретное нужное ему значение.

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


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

1 hour ago, Darth Vader said:

Автор хочет не этого.

Прочитайте в заглавном посте самый конец. Ему не важно значение адреса, которым инициализируется указатель (у вас это 100). Важно, чтобы по этому адресу лежало конкретное нужное ему значение.

так получается. выделился адрес. есть значение. другое дело я сохранить этот адрес в памяти не могу. значение не сохраниться.

 

если только... не сохранить явно по адресу  IN_EXPR expression @0x20004000. тогда все адреса и значения в них сохраняться после рисета. я правильно понимаю?

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

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


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

#define MY_CONST_VAL 100
static const int Value = MY_CONST_VAL;
expression.l_var = &Value;

Компоновщик разместит объект Value со значением 100 в области флеш-памяти. Вы присвоите вашему указателю его адрес. В итоге ваш указатель будет указывать на нужное вам число 100, адрес которого вам впринципе не важен, его за вас выбрал компоновщик. То, что вам было надо. Вам про это ещё на первой странице написали.

 

И ещё. Различайте понятия:

- указатель на константу;

- константный указатель;

- константный указатель на константу.

То, что у вас в структуре указатель стал указывать на константу не значит, что он является указателем на константу. Т.к. он может указывать не только на константу.

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

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


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

1 hour ago, Darth Vader said:

#define MY_CONST_VAL 100
static const int Value = ;
expression.l_var = &Value;

Компоновщик разместит объект Value со значением 100 в области флеш-памяти. Вы присвоите вашему указателю его адрес. В итоге ваш указатель будет указывать на нужное вам число 100, адрес которого вам впринципе не важен, его за вас выбрал компоновщик. То, что вам было надо. Вам про это ещё на первой странице написали.

 

И ещё. Различайте понятия:

- указатель на константу;

- константный указатель;

- константный указатель на константу.

То, что у вас в структуре указатель стал указывать на константу не значит, что он является указателем на константу. Т.к. он может указывать не только на константу.

а зачем мне выделять костанту програмно?

expression.l_var = &Value; или expression.l_var = (void *)100; не одно и то же? кроме того что я экономлю Value.

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

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


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

2 minutes ago, jenya7 said:

expression.l_var = &Value; или expression.l_var = (void *)100; не одно и то же? 

Нет.

В первом случае вы присваиваете указателю адрес объекта Value со значением 100. Адрес его размещения выбран компоновщиком автоматически. Но значение задано вами явно - число 100.

Во втором - приводите к типу указателя целое число 100. В результате в вашем указателе будет лежать адрес 100. Т.е. 100 - это адрес, а не значение. Что лежит по адресу 100 вам неизвестно. Т.е. ваш указатель указывает на мусор. А должен указывать на число 100.

Почувствуйте разницу.

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


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

1 hour ago, Darth Vader said:

Нет.

В первом случае вы присваиваете указателю адрес объекта Value со значением 100. Адрес его размещения выбран компоновщиком автоматически. Но значение задано вами явно - число 100.

Во втором - приводите к типу указателя целое число 100. В результате в вашем указателе будет лежать адрес 100. Т.е. 100 - это адрес, а не значение. Что лежит по адресу 100 вам неизвестно. Т.е. ваш указатель указывает на мусор. А должен указывать на число 100.

Почувствуйте разницу.

Вот данные с отладчика.

           Value             Location         Type  

l_var    0x00000064    0x2000455C    void *   

 

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


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

Значение 0х64 в столбце Value - это значение указателя, которое есть адрес. Да, он действительно равен 100. Адрес равен 100. Вы же хотели получить иное: чтобы значение, на которое указывает указатель, было бы целое число 100.

Проверьте правильность вашего варианта вашим же примером из первого поста темы: 

if (*(expression.l_var) == 100) {

}
else {

};

По какой ветке пойдёт программа? На что указывает указатель?

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

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


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

1 hour ago, Darth Vader said:

Значение 0х64 в столбце Value - это значение указателя, которое есть адрес. Да, он действительно равен 100. Адрес равен 100. Вы же хотели получить иное: чтобы значение, на которое указывает указатель, было бы целое число 100.

Проверьте правильность вашего варианта вашим же примером из первого поста темы: 


if (*(expression.l_var) == 100) {

}
else {

};

По какой ветке пойдёт программа? На что указывает указатель?

 

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

expression.l_var = (*int) 100;

if ((int)(expression.l_var) == 100) 
{
    here = 1;
}

 

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


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

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

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

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

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

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

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

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

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

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