Цитата(1kvi1 @ Mar 19 2011, 06:57)

Старт-ап код я исправил и указал вершину на 0x100. Я так понимаю линкер должен это учесть и не располагать переменые и структуры ниже адреса 0x100?
Нет смысла править STARTUP.A51 для этого. Линкер его не анализирует. А располагает все переменные и структуры согласно выбранной модели памяти. Попробуйте установить модель памяти LARGE и увидите совсем другую картину, если конечно в программе нет ошибок.
Что бы убедиться в том где располагается стек, а так же насколько глубоко и куда он "растет", можно попробовать вот такую рекомендацию от Keil-а, -
http://www.keil.com/support/docs/192.htm Если очень хочется проверить работу со стеком не в стимуляторе, а на боевой программе, то можно воспользоваться вот такой рекомендацией, -
http://www.keil.com/support/docs/2095.htm.
Цитата(1kvi1 @ Mar 19 2011, 06:57)

Кроме того ассемблерная инструкция - совсем не указание линкеру освободить данную область памяти?
Совершенно не указ. Если необходимо располагать переменные по абсолютному и заранее известному адресу в RAM, то почитайте вот эту рекомендацию, -
http://www.keil.com/support/docs/1455.htm Но такой подход требует повышенной внимательности и аккуратности от программиста.
Цитата(1kvi1 @ Mar 19 2011, 06:57)

Как решить проблему?
Несколько раз перечитал всю ветку, но так и не понял, что Вы называете проблемой, какое поведение хотите получить, а главное зачем?
Если переменные "забивают" стек, то это либо ошибка (ошибки) в программе, либо неверно выбранная модель памяти. Но в любом случае, танцы с бубном вокруг месторасположения стека этих проблем не решат.