Перейти к содержанию
    

указатели на функции в SDCC

захотелось мне немного усовершенствовать стандартный printf_tiny(), который использует внешнюю (extern) функцию putchar() для работы с uart. А именно -- вместо того, чтобы объявлять ее как extern void putchar(char), сделать extern void (*putchar)(char). В основной программе, соответственно, объявить явно этот указатель и присваивать ему по ходу дела, что захочется (ну, например, одну реализацию для синхронного, другую -- для асинхронного ввода-вывода).

 

Так вот, проблема в том, что sdcc генерит неправильный код. Исходный код

char putchar(char);
char (*f)(char);

int main(){
   char c;
   f = putchar;
   c = f(9);
   return 0;
}

char putchar(char c){
   return c;
}

 

превратился после компиляции в

_main:
;   тут стандартная преамбула
;   a.c:26: f = putchar;
   mov _f,#_putchar
   mov (_f + 1),#(_putchar >> 8)
;   a.c:27: c = f(9);
   mov a,#00103$
   push    acc
   mov a,#(00103$ >> 8)
   push    acc
   push    _f
   push    (_f + 1)
   mov dpl,#0x09
   ret
00103$:
;   a.c:28: return 0;
   mov dptr,#0x0000
   ret

;   a.c:31: char putchar(char c){
;   -----------------------------------------
;    function putchar
;   -----------------------------------------
_putchar:
;   a.c:32: return c;
   ret

 

Видно, что не получилось никакого кода, который бы вызывал putchar(). Вопрос -- а как делать правильно? или SDCC просто не поддерживает такой способ вызова функций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видно, что не получилось никакого кода, который бы вызывал putchar().

Вызов функции - есть. Естественно, что производится он не через команду call, а заталкивается в стек адрес возврата и содержимое указателя f, а затем выполняется переход на функцию через команду ret.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...