Jump to content

    
Sign in to follow this  
jenya7

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

Recommended Posts

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

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

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

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

Share this post


Link to post
Share on other sites
12 минут назад, jenya7 сказал:

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

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

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

Share this post


Link to post
Share on other sites
2 hours ago, gerber said:

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

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

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

Share this post


Link to post
Share on other sites
10 минут назад, jenya7 сказал:

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

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

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

Share this post


Link to post
Share on other sites
1 hour ago, gerber said:

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

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

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

Share this post


Link to post
Share on other sites
12 hours ago, jenya7 said:

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


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

IN_EXPR expression;

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

expression.l_var = (void*)100;

 

Share this post


Link to post
Share on other sites
18 hours ago, dimka76 said:

expression.l_var = (void*)100;

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

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

Share this post


Link to post
Share on other sites
1 hour ago, Darth Vader said:

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

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

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

 

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

Edited by jenya7

Share this post


Link to post
Share on other sites
#define MY_CONST_VAL 100
static const int Value = MY_CONST_VAL;
expression.l_var = &Value;

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

 

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

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

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

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

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

Edited by Darth Vader

Share this post


Link to post
Share on other sites
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.

Edited by jenya7

Share this post


Link to post
Share on other sites
2 minutes ago, jenya7 said:

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

Нет.

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

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

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

Share this post


Link to post
Share on other sites
1 hour ago, Darth Vader said:

Нет.

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

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

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

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

           Value             Location         Type  

l_var    0x00000064    0x2000455C    void *   

 

Share this post


Link to post
Share on other sites

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

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

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

}
else {

};

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

Edited by Darth Vader

Share this post


Link to post
Share on other sites
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;
}

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this