[an error occurred while processing this directive]
|
Верно, линковщик рассчитывает. Но я в предыдущем ответе кое-что пропустил. В unione. Там перед строчками file1.obj(PLLP),
file2.obj(PLLCT) надо вставить file1.obj(.text), file2.obj(.text) соответственно. Т.е.:
UNION: run=IPMRAM
{
PLLP: load=IPMRAT
{
PLLP_start=.;
file1.obj(.text)
file1.obj(PLLP)
PLLP_length=.-PLLP_start;
}
PLLCT: load=IPMRAR
{
PLLCT_start=.;
file2.obj(.text)
file2.obj(PLLCT)
PLLCT_length=.-PLLCT_start;
}
Иначе asm(" .label") дадут не те значения.
Торопился, блин. В воскресенье у нас только до 20 можно на работе быть.
Охрана над душой висела, когда писал.
Если интересно, еще одно замечание по поводу определения размера С функции. Правда не очень красиво. Если известен ее начальный адрес, то конец можно определить, вставив asm(" .label") перед закрывающей скобкой для void ф-ии, или перед return для не void.
Т.е.:
void func()
{
.....
asm(" .label funcend");
}
Недостаток - funcend не обязательно будет указывать на ret, только если уж ф-ия простая до страсти. Скорее всего будет указывать на frame, после которого могут быть popm'ы или еще что-нибудь, а потом уже ret или retd. Т.е. на первую инструкцию после всех "полезных" операций в ф-ии.
Но, поскольку, оставшийся кусок небольшой и ret(retd) там только раз, то можно после funcend (включая ее) отыскать код к-ды ret или retd. В случае ret - это и будет концом ф-ии, в случае retd - 2 надо прибавить.
E-mail: info@telesys.ru