Author |
Message |
Romanich
Banned
Joined: 12 Oct 2006 16:44 Posts: 608
|
Приятно был удивлен что Си делает такое:
тоесть вызывается функция с тремя параметрами, возвращающая ничего по адресу 0x10000
а как сделать переход на си по определённому адресу?
|
15 Apr 2007 19:06 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22626 Location: Silicon Valley
|
Тебя интересует 16-битный или 32-битный режим? Если речь идёт о ваткомовской флат-модели, то тебе надо перейти внутри 4-гигабайтного сегмента программы или наружу? Наружу сильно сложнее как я понимаю, но в крайнем случае можно на встроенном асме что-то воткнуть...
|
15 Apr 2007 19:12 |
|
|
Romanich
Banned
Joined: 12 Oct 2006 16:44 Posts: 608
|
Нет, тут речь идёт о физическом адресе:) Как на сях организовать переход? (без асм-вставок)
|
15 Apr 2007 20:07 |
|
|
Romanich
Banned
Joined: 12 Oct 2006 16:44 Posts: 608
|
Ну допустим мне надо осуществить переход внутри сегмента 4Гб
|
15 Apr 2007 23:17 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22626 Location: Silicon Valley
|
Хм, в ваткоме goto требует только имя и такая метка может быть только в пределах видимости... А зачем тебе такие проивзольные переходы? Допустим в микроконтроллерах их можно себе представить, а в PC зачем?
|
16 Apr 2007 06:17 |
|
|
Romanich
Banned
Joined: 12 Oct 2006 16:44 Posts: 608
|
Для написания загрузчиков в контроллерах!
Известен начальный адрес загрузчика, адрес приложения выбирается.
Загрузчик должен с UART'а считать код и записать его в память микроллера. И передать коду управление. Поставщик кода - Вин32 прога
У меня пока всё работает с вызовом функции кода, в идеале нужен переход на фрагмент кода - тоесть возврата не будет(да и стек экономится
|
16 Apr 2007 18:28 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22626 Location: Silicon Valley
|
| | | | Romanich wrote: Для написания загрузчиков в контроллерах! Известен начальный адрес загрузчика, адрес приложения выбирается. Загрузчик должен с UART'а считать код и записать его в память микроллера. И передать коду управление. Поставщик кода - Вин32 прога У меня пока всё работает с вызовом функции кода, в идеале нужен переход на фрагмент кода - тоесть возврата не будет(да и стек экономится | | | | |
Ну вызови функцию и не делай return - делов то
|
16 Apr 2007 18:40 |
|
|
Romanich
Banned
Joined: 12 Oct 2006 16:44 Posts: 608
|
при вызове функции без праметров в стек заносится адрес возврата. Меня жаба давит, что стек незначительно, но расходуется. Даже если перетру его настройкой сегментов - грязно это!
|
16 Apr 2007 18:44 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22626 Location: Silicon Valley
|
Если у тебя PC, то 4 байта - фигня
|
16 Apr 2007 19:22 |
|
|
Romanich
Banned
Joined: 12 Oct 2006 16:44 Posts: 608
|
Либо я хреново объясняю, либо меня читают невнимательно
Ну конечно же такие трюки мне восстребованы в контроллере!!!
|
16 Apr 2007 22:31 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22626 Location: Silicon Valley
|
Тогда при чём здесь C для DOS (см. название темы)?
В Си для контроллера должна быть возможность задавать непостредственно адрес
|
17 Apr 2007 05:17 |
|
|
Romanich
Banned
Joined: 12 Oct 2006 16:44 Posts: 608
|
ну не заводить же тему "Си для МК"
Форум и так пухнет от избытка тем, поэтому и загружается плохо
|
17 Apr 2007 15:21 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22626 Location: Silicon Valley
|
А почему бы и не завести?
У меня всё грузится быстро
|
17 Apr 2007 16:52 |
|
|
bar
Senior
Joined: 07 Aug 2006 10:18 Posts: 185
|
читай внимательно документацию на компилятор. в стандарте, по-моему, такого нету. а вот в компиляторе -- может и есть. по-крайней мере, gcc умеет адреса меток в указатели складывать, и наверное это значит, что можно адрес в goto использовать.
|
08 Aug 2007 21:45 |
|
|
SfS
Doomed
Joined: 16 Apr 2005 22:35 Posts: 492 Location: Томск
|
Берёшь gcc (avr-gcc или arm-elf-gcc).
1. Как на С перейти по произвольному адресу :
((void (*)())(0x1000))(); - переходит по адресу 0x1000.
2. Насчёт стека
void dummy() __attribute__ ((naked));
void dummy()
{
/* тело процедуры */
}
Атрибут naked говорит компилятору, что процедура "голая", то есть при входе в неё НИЧЕГО на стек не кладётся, а при возврате - не берётся...
|
20 Aug 2007 22:40 |
|
|