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

Can't link assemler code with c-code

I'm not that much into assemler, so I try to reuse existing asm-code as i2c-driver. I've found original Philips code for that. I try now to link it with c-code but get always linker warnings.



Any help appreciated!



NAME . . . . . . . . . USAGE    MODULE NAMES
--------------------------------------------

?C_START . . . . . . . CODE;    ** L51 GENERATED **  ?C_STARTUP
?C_STARTUP . . . . . . CODE;    ?C_STARTUP  ASMS
?IIC_TEST_DEVICE . . . CODE;    IIC_DRIVER
?IIC_TEST_DEVICE?BYTE. DATA;    IIC_DRIVER
?INIT_IIC?BYTE . . . . DATA;    IIC_DRIVER
?_IIC_WRITE_SUB?BYTE . ILLEGAL  ** UNRESOLVED **  ASMS
IIC_ERROR. . . . . . . BIT;     IIC_DRIVER
MAIN . . . . . . . . . CODE;    ASMS
_IIC_WRITE_SUB . . . . ILLEGAL  ** UNRESOLVED **  ASMS
_INIT_IIC. . . . . . . CODE;    IIC_DRIVER  ASMS

*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  _IIC_WRITE_SUB
    MODULE:  asms.obj (ASMS)

*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  ?_IIC_WRITE_SUB?BYTE
    MODULE:  asms.obj (ASMS)

*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  ?_IIC_WRITE_SUB?BYTE
    MODULE:  asms.obj (ASMS)
    ADDRESS: 0277H

*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  _IIC_WRITE_SUB
    MODULE:  asms.obj (ASMS)
    ADDRESS: 027FH 


Here my c-code:

#include <REG552.H>
#include "iic.h"

#define myIICaddr 0x55		// my own i2c slave address


/*------------------------------------------------
MAIN C Function
------------------------------------------------*/
void main (void)
{
	unsigned char reg = 0;

	// Init routines
    Init_IIC(myIICaddr);

	// set control-register: stop counting, enable alarm
	reg = 0xC4;
	if(IIC_Write_Sub(RTC_ADDRESS, 1,  , 0x00) != I2C_OK)
	{
		// error
	}

	while (1)
	{
		;
	}
}


and the beginning of the asm-code:

$LIST
$REGISTERBANK (0,1)
$NOSYMBOLS
$PAGEWIDTH (130)
NAME    IIC_DRIVER


;
;       Includes: EQREG652.ASM
;
$NOLIST
$INCLUDE (EQREG652.ASM)
$LIST
;
; Public labels defined in this Module:
; *************************************
        public  ?IIC_Test_Device
        public  ?IIC_Test_Device?BYTE
        public  _Init_IIC
        public  ?Init_IIC?BYTE
;
$EJECT
;
...snipp...

?BI?IICBit      Segment Bit
                Rseg    ?BI?IICBit
;
                public  IIC_Error
IIC_Error:      dbit    1               ; IIC Error Bit
;
?BA?IICBitAdr       Segment Data BitAddressable
                Rseg    ?BA?IICBitAdr
;
IICCntrl:       ds      1               ; Bit Addressable IIC Control Register
;
?DT?IICPar          Segment Data
                Rseg    ?DT?IICPar

?IIC_Test_Device?BYTE:
?IIC_Write?BYTE:
?Init_IIC?BYTE:
;
SlaveAddress:   ds      1               ; Slave Address Include R/W
DataCount1:     ds      1               ; Block 1 Count
DataIndex1:     ds      1               ; Block 1 Transfer Buffer Address
SubAddress:     ds      1               ; Sub Address ( If Any )
DataCount2:     ds      1               ; Block 2 Count
DataIndex2:     ds      1               ; Block 2 Transfer Buffer Address
;
$EJECT
;
$EJECT
IICCode         Segment Code InBlock
                Rseg    IICCode
;

...snipp...

*****************************************************************
;       * Init_IIC:                                                     *
;       *    PROCEDURE ( OwnSlaveAddress ) ;                            *
;       *    DECLARE OwnSlaveAddress BYTE ;                             *
;       *                                                               *
;       *    Initialises the IIC SIO1 data, sets the Own Slave Address  *
;       *                                                               *
;       *    NOTE: This procedure must be called                        *
;       *          after power on before use of any other IIC procedure *
;       *****************************************************************
_Init_IIC:       mov     s1adr,SlaveAddress              ; Setup Own Slave Address
                mov     s1con,#NSTA_NSTO_AA             ; Assert Acknowledge on Slave Address
                mov     IICCntrl,#0                     ; Initialise Control / Status Register
                setb    es1                             ; Enable SIO1 Interrupt

Parents
  • The naming convention is the key to the problem, but not necessarily the problem itself, here. Different compilers use different conventions for argument passing and name mapping from source language to actual object file symbols.

    If that ASM file is meant to be used with PLM/51, you'll have to *tell* Keil C51 about that fact. PLM/51 is in the index of the Cx51 manual --- go look for yourself.

Reply
  • The naming convention is the key to the problem, but not necessarily the problem itself, here. Different compilers use different conventions for argument passing and name mapping from source language to actual object file symbols.

    If that ASM file is meant to be used with PLM/51, you'll have to *tell* Keil C51 about that fact. PLM/51 is in the index of the Cx51 manual --- go look for yourself.

Children
  • Even though all your fine input, I still believe it must be something with syntax or asm <-> c-code. When I look at the map file generatet I see the the functions public and later illegal:

      B:0022H.1       SEGMENT       IICBIT
      D:0020H         SEGMENT       IICBITADR
      D:0010H         SEGMENT       IICPAR
      C:10F6H         SEGMENT       IICCODE
      C:164DH         SEGMENT       IICINITCODE
      C:165BH         SEGMENT       IICINTCODE
      C:0E00H         SEGMENT       IICINTSTATES
      C:1117H         PUBLIC        ?IIC_READ
      D:0010H         PUBLIC        ?IIC_READ?BYTE
      C:1111H         PUBLIC        ?IIC_READ_STATUS
      D:0010H         PUBLIC        ?IIC_READ_STATUS?BYTE
      C:1101H         PUBLIC        ?IIC_READ_SUB
      D:0010H         PUBLIC        ?IIC_READ_SUB?BYTE
      C:10F6H         PUBLIC        ?IIC_TEST_DEVICE
      D:0010H         PUBLIC        ?IIC_TEST_DEVICE?BYTE
      C:110DH         PUBLIC        ?IIC_WRITE
      D:0010H         PUBLIC        ?IIC_WRITE?BYTE
      C:10FDH         PUBLIC        ?IIC_WRITE_MEMORY
      D:0010H         PUBLIC        ?IIC_WRITE_MEMORY?BYTE
      C:1105H         PUBLIC        ?IIC_WRITE_SUB
      D:0010H         PUBLIC        ?IIC_WRITE_SUB?BYTE
      C:1122H         PUBLIC        ?IIC_WRITE_SUB_READ
      D:0010H         PUBLIC        ?IIC_WRITE_SUB_READ?BYTE
      C:1109H         PUBLIC        ?IIC_WRITE_SUB_SWINC
      D:0010H         PUBLIC        ?IIC_WRITE_SUB_SWINC?BYTE
      C:111EH         PUBLIC        ?IIC_WRITE_SUB_WRITE
      D:0010H         PUBLIC        ?IIC_WRITE_SUB_WRITE?BYTE
      C:164DH         PUBLIC        ?INIT_IIC
      D:0010H         PUBLIC        ?INIT_IIC?BYTE
      B:0022H.1       PUBLIC        IIC_ERROR
    
    ...snipp...
    
    INTER-MODULE CROSS-REFERENCE LISTING
    ------------------------------------
    
    
    NAME . . . . . . . . . . . USAGE    MODULE NAMES
    ------------------------------------------------
    
    ...snipp...
    
    ?IIC_READ. . . . . . . . . CODE;    IIC
    ?IIC_READ?BYTE . . . . . . DATA;    IIC
    ?IIC_READ_STATUS . . . . . CODE;    IIC
    ?IIC_READ_STATUS?BYTE. . . DATA;    IIC
    ?IIC_READ_SUB. . . . . . . CODE;    IIC
    ?IIC_READ_SUB?BYTE . . . . DATA;    IIC  PAGE  RTC
    ?IIC_TEST_DEVICE . . . . . CODE;    IIC
    ?IIC_TEST_DEVICE?BYTE. . . DATA;    IIC
    ?IIC_WRITE . . . . . . . . CODE;    IIC
    ?IIC_WRITE?BYTE. . . . . . DATA;    IIC
    ?IIC_WRITE_MEMORY. . . . . CODE;    IIC
    ?IIC_WRITE_MEMORY?BYTE . . DATA;    IIC
    ?IIC_WRITE_SUB . . . . . . CODE;    IIC
    ?IIC_WRITE_SUB?BYTE. . . . DATA;    IIC  RTC
    ?IIC_WRITE_SUB_READ. . . . CODE;    IIC
    ?IIC_WRITE_SUB_READ?BYTE . DATA;    IIC
    ?IIC_WRITE_SUB_SWINC . . . CODE;    IIC
    ?IIC_WRITE_SUB_SWINC?BYTE. DATA;    IIC
    ?IIC_WRITE_SUB_WRITE . . . CODE;    IIC
    ?IIC_WRITE_SUB_WRITE?BYTE. DATA;    IIC
    ?INIT_IIC. . . . . . . . . CODE;    IIC
    ?INIT_IIC?BYTE . . . . . . DATA;    IIC  ASMS
    
    ...snipp...
    
    IIC_ERROR. . . . . . . . . BIT;     IIC
    IIC_READ_SUB . . . . . . . ILLEGAL  ** UNRESOLVED **  PAGE  RTC
    IIC_WRITE_SUB. . . . . . . ILLEGAL  ** UNRESOLVED **  RTC
    INITLCD. . . . . . . . . . CODE;    LCD  ASMS
    INIT_GLOBALS . . . . . . . CODE;    RTC  ASMS
    INIT_IIC . . . . . . . . . ILLEGAL  ** UNRESOLVED **  ASMS
    

  • The error messages you listed before are telling you that the _IIC_WRITE_SUB function and its argument space (?_IIC_WRITE_SUB?BYTE) were not found.

    I don't see them in the listing you posted.

    I do see ?IIC_WRITE_SUB and ?IIC_WRITE_SUB?BYTE but these are not the same.

    Also, the unresolved symbols in this listing: IIC_READ_SUB, IIC_WRITE_SUB, and INIT_IIC are not included in the listing.

    ?IIC_READ_SUB, ?IIC_WRITE_SUB, and ?IIC_INIT are included, but these names do not match.


    Jon