This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Problem with pointer to function

Hello,

data char var;
void (code * data fptr)(void);

void fun(void)
{
   var = 10;
}

void main(void)
{
   fptr = fun;
   (*fptr)();   // OK!
   (*(fptr = fun))();   // This line generates bad code!
   (*(fptr = &fun))();      // OK!
   while (1);
}


Genereted source file:

; .\main.SRC generated from: main.c
; COMPILER INVOKED BY:
;        C:\C51\V8_17\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND SRC(.\main.SRC)


NAME    MAIN

?PR?fun?MAIN         SEGMENT CODE
?PR?main?MAIN        SEGMENT CODE
?DT?MAIN             SEGMENT DATA
        EXTRN   CODE (?C_STARTUP)
        EXTRN   CODE (?C?ICALL)
        PUBLIC  var
        PUBLIC  fptr
        PUBLIC  main
        PUBLIC  fun

        RSEG  ?DT?MAIN
           fptr:   DS   2
            var:   DS   1
;
; data char var;
; void (code * data fptr)(void);
;
; void fun(void)

        RSEG  ?PR?fun?MAIN
fun:
                        ; SOURCE LINE # 5
; {
                        ; SOURCE LINE # 6
;    var = 10;
                        ; SOURCE LINE # 7
        MOV     var,#0AH
; }
                        ; SOURCE LINE # 8
        RET
; END OF fun

;
; void main(void)

        RSEG  ?PR?main?MAIN
main:
        USING   0
                        ; SOURCE LINE # 10
; {
                        ; SOURCE LINE # 11
;    fptr = fun;
                        ; SOURCE LINE # 12
        MOV     fptr,#HIGH (fun)
        MOV     fptr+01H,#LOW (fun)
;    (*fptr)(); // OK!
                        ; SOURCE LINE # 13
        MOV     R2,fptr
        MOV     R1,fptr+01H
        LCALL   ?C?ICALL
;    (*(fptr = fun))(); // This line generates bad code!
                        ; SOURCE LINE # 14

        MOV     R6,fun
        MOV     fptr,R6
        MOV     R7,fun+01H
        MOV     fptr+01H,R7
        MOV     R2,AR6
        MOV     R1,AR7
        LCALL   ?C?ICALL

;    (*(fptr = &fun))();    // OK!
                        ; SOURCE LINE # 15
        MOV     R2,#HIGH (fun)
        MOV     R1,#LOW (fun)
        MOV     fptr,R2
        MOV     fptr+01H,R1
        LCALL   ?C?ICALL
?C0002:
;    while (1);
                        ; SOURCE LINE # 16
        SJMP    ?C0002
; END OF main

        END


If I change

void (code * data fptr)(void);


to

void (* data fptr)(void);


everything is OK. Why?

Thanks.

Henri

0