jenya7 0 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 1 hour ago, gerber said: В опкоде инструкции же, это и есть immediate value. да но физически где оно находиться? не в редакторе, в контролере. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 19 минут назад, jenya7 сказал: да но физически где оно находиться? не в редакторе, в контролере. Мне одному кажется, что на форуме не хватает раздела: "Хохмы нашего форума?" Я даже знаю кто там будет самым активным автором. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 12 минут назад, jenya7 сказал: да но физически где оно находиться? не в редакторе, в контролере. В теле опкода инструкции, например, из 32-бит опкода часть бит (например, 12 бит) может быть выделено под immediate value, в этом случае с помощью такой инструкции можно работать с константным числом от 0 до 4095, или -2048...2047, если трактуется как знаковое число. В тех архитектурах или режимах, где инструкции короткие, скажем, 16-битные, под immediate value может быть выделено совсем мало бит, в этом случае такие инструкции используются в совсем простых случаях, скажем, для инкремента (a++). В остальных случаях используется смещение относительно PC, и константа забирается с адреса, лежащего в окрестностях текущего выполнения кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 2 hours ago, gerber said: В теле опкода инструкции, например, из 32-бит опкода часть бит (например, 12 бит) может быть выделено под immediate value, в этом случае с помощью такой инструкции можно работать с константным числом от 0 до 4095, или -2048...2047, если трактуется как знаковое число. В тех архитектурах или режимах, где инструкции короткие, скажем, 16-битные, под immediate value может быть выделено совсем мало бит, в этом случае такие инструкции используются в совсем простых случаях, скажем, для инкремента (a++). В остальных случаях используется смещение относительно PC, и константа забирается с адреса, лежащего в окрестностях текущего выполнения кода. а как константа связанна с командой? как инструкция знает что именно этой константой нужно оперировать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gerber 8 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 10 минут назад, jenya7 сказал: а как константа связанна с командой? как инструкция знает что именно этой константой нужно оперировать? Дык на то и опкод, по которому процессор декодирует инструкцию. После декодирования опкода процессор "понимает", что это, к примеру, MOV Rx, #immediate, пересылка immediate value в регистр, в этом случае, часть бит интерпретируется как номер регистра-приемника, а часть бит как собственно immediate value. Другой опкод будет по-другому интерпретировать биты инструкции, и вместо immediate value там окажется, к примеру, смещение относительной адресации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 1 hour ago, gerber said: Дык на то и опкод, по которому процессор декодирует инструкцию. После декодирования опкода процессор "понимает", что это, к примеру, MOV Rx, #immediate, пересылка immediate value в регистр, в этом случае, часть бит интерпретируется как номер регистра-приемника, а часть бит как собственно immediate value. Другой опкод будет по-другому интерпретировать биты инструкции, и вместо immediate value там окажется, к примеру, смещение относительной адресации. понял. спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 8 мая, 2019 Опубликовано 8 мая, 2019 · Жалоба 12 hours ago, jenya7 said: Есть структура с указателями на переменные typedef struct { void *l_var; void *r_var; }IN_EXPR; IN_EXPR expression; А если я хочу значение указателя инициализировать константой? expression.l_var = (void*)100; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 9 мая, 2019 Опубликовано 9 мая, 2019 · Жалоба 18 hours ago, dimka76 said: expression.l_var = (void*)100; Автор хочет не этого. Прочитайте в заглавном посте самый конец. Ему не важно значение адреса, которым инициализируется указатель (у вас это 100). Важно, чтобы по этому адресу лежало конкретное нужное ему значение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 9 мая, 2019 Опубликовано 9 мая, 2019 (изменено) · Жалоба 1 hour ago, Darth Vader said: Автор хочет не этого. Прочитайте в заглавном посте самый конец. Ему не важно значение адреса, которым инициализируется указатель (у вас это 100). Важно, чтобы по этому адресу лежало конкретное нужное ему значение. так получается. выделился адрес. есть значение. другое дело я сохранить этот адрес в памяти не могу. значение не сохраниться. если только... не сохранить явно по адресу IN_EXPR expression @0x20004000. тогда все адреса и значения в них сохраняться после рисета. я правильно понимаю? Изменено 9 мая, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 9 мая, 2019 Опубликовано 9 мая, 2019 (изменено) · Жалоба #define MY_CONST_VAL 100 static const int Value = MY_CONST_VAL; expression.l_var = &Value; Компоновщик разместит объект Value со значением 100 в области флеш-памяти. Вы присвоите вашему указателю его адрес. В итоге ваш указатель будет указывать на нужное вам число 100, адрес которого вам впринципе не важен, его за вас выбрал компоновщик. То, что вам было надо. Вам про это ещё на первой странице написали. И ещё. Различайте понятия: - указатель на константу; - константный указатель; - константный указатель на константу. То, что у вас в структуре указатель стал указывать на константу не значит, что он является указателем на константу. Т.к. он может указывать не только на константу. Изменено 9 мая, 2019 пользователем Darth Vader Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 9 мая, 2019 Опубликовано 9 мая, 2019 (изменено) · Жалоба 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. Изменено 9 мая, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 9 мая, 2019 Опубликовано 9 мая, 2019 · Жалоба 2 minutes ago, jenya7 said: expression.l_var = &Value; или expression.l_var = (void *)100; не одно и то же? Нет. В первом случае вы присваиваете указателю адрес объекта Value со значением 100. Адрес его размещения выбран компоновщиком автоматически. Но значение задано вами явно - число 100. Во втором - приводите к типу указателя целое число 100. В результате в вашем указателе будет лежать адрес 100. Т.е. 100 - это адрес, а не значение. Что лежит по адресу 100 вам неизвестно. Т.е. ваш указатель указывает на мусор. А должен указывать на число 100. Почувствуйте разницу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 9 мая, 2019 Опубликовано 9 мая, 2019 · Жалоба 1 hour ago, Darth Vader said: Нет. В первом случае вы присваиваете указателю адрес объекта Value со значением 100. Адрес его размещения выбран компоновщиком автоматически. Но значение задано вами явно - число 100. Во втором - приводите к типу указателя целое число 100. В результате в вашем указателе будет лежать адрес 100. Т.е. 100 - это адрес, а не значение. Что лежит по адресу 100 вам неизвестно. Т.е. ваш указатель указывает на мусор. А должен указывать на число 100. Почувствуйте разницу. Вот данные с отладчика. Value Location Type l_var 0x00000064 0x2000455C void * Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 9 мая, 2019 Опубликовано 9 мая, 2019 (изменено) · Жалоба Значение 0х64 в столбце Value - это значение указателя, которое есть адрес. Да, он действительно равен 100. Адрес равен 100. Вы же хотели получить иное: чтобы значение, на которое указывает указатель, было бы целое число 100. Проверьте правильность вашего варианта вашим же примером из первого поста темы: if (*(expression.l_var) == 100) { } else { }; По какой ветке пойдёт программа? На что указывает указатель? Изменено 9 мая, 2019 пользователем Darth Vader Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 9 мая, 2019 Опубликовано 9 мая, 2019 · Жалоба 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться