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

Compiling through asm-source file. See any overlays?

I've found lots of differences between direct compiling from C and compiling through assembler! This differences are in the dealing with functions' arguments. for example:
When compiling directly from C, overlays are seems work, but in other way linker does not use any overlays, ignoring all "OVERLAYABLE" keywords in source file!

Sample C program:

void fun1(int a, int b,int c,int d) {
        a=b=c=d;
        return ;
}

void fun2(int a, int b, int c, int d) {
        c=a=b=d;
        //fun1(a,b,c,d);
        return ;
}

main() {
        fun1(0,0,0,0);
        fun2(0,0,0,0);
        while (1) ;
}

We'll got the following asm-source file:
; .\main.SRC generated from: main.c
; COMPILER INVOKED BY:
;        C:\Keil\C51\BIN\C51.EXE main.c OPTIMIZE(7,SPEED) REGFILE(.\test.ORC) NOINTPROMOTE NOPRINT SRC(.\main.SRC)


NAME	MAIN

?PR?_fun1?MAIN       SEGMENT CODE
?DT?_fun1?MAIN       SEGMENT DATA OVERLAYABLE
?PR?_fun2?MAIN       SEGMENT CODE
?DT?_fun2?MAIN       SEGMENT DATA OVERLAYABLE
?PR?main?MAIN        SEGMENT CODE
	EXTRN	CODE (?C_STARTUP)
	PUBLIC	main
	PUBLIC	?_fun2?BYTE
	PUBLIC	_fun2
	PUBLIC	?_fun1?BYTE
	PUBLIC	_fun1

	RSEG  ?DT?_fun1?MAIN
?_fun1?BYTE:
          a?040:   DS   2
          b?041:   DS   2
          c?042:   DS   2
          d?043:   DS   2

	RSEG  ?DT?_fun2?MAIN
?_fun2?BYTE:
          a?144:   DS   2
          b?145:   DS   2
          c?146:   DS   2
          d?147:   DS   2
; void fun1(int a, int b,int c,int d) {

	RSEG  ?PR?_fun1?MAIN
_fun1:
	USING	0
			; SOURCE LINE # 1
;---- Variable 'a?040' assigned to Register 'R6/R7' ----
;---- Variable 'c?042' assigned to Register 'R2/R3' ----
;---- Variable 'b?041' assigned to Register 'R4/R5' ----
;         a=b=c=d;
			; SOURCE LINE # 2
	MOV  	R6,d?043
	MOV  	R7,d?043+01H
	MOV  	R2,AR6
	MOV  	R3,AR7
	MOV  	R4,AR6
	MOV  	R5,AR7
;         return ;
; }
			; SOURCE LINE # 4
?C0001:
	RET
; END OF _fun1

;
; void fun2(int a, int b, int c, int d) {

	RSEG  ?PR?_fun2?MAIN
_fun2:
	USING	0
			; SOURCE LINE # 6
;---- Variable 'a?144' assigned to Register 'R6/R7' ----
;---- Variable 'c?146' assigned to Register 'R2/R3' ----
;---- Variable 'b?145' assigned to Register 'R4/R5' ----
;         c=a=b=d;
			; SOURCE LINE # 7
	MOV  	R6,d?147
	MOV  	R7,d?147+01H
	MOV  	R4,AR6
	MOV  	R5,AR7
	MOV  	R2,AR4
	MOV  	R3,AR5
;         //fun1(a,b,c,d);
;         return ;
; }
			; SOURCE LINE # 10
?C0002:
	RET
; END OF _fun2

;
; main() {

	RSEG  ?PR?main?MAIN
main:
	USING	0
			; SOURCE LINE # 12
;         fun1(0,0,0,0);
			; SOURCE LINE # 13
	CLR  	A
	MOV  	?_fun1?BYTE+06H,A
	MOV  	?_fun1?BYTE+07H,A
	MOV  	R3,A
	MOV  	R2,A
	MOV  	R5,A
	MOV  	R4,A
	MOV  	R7,A
	MOV  	R6,A
	LCALL	_fun1
;         fun2(0,0,0,0);
			; SOURCE LINE # 14
	MOV  	?_fun2?BYTE+06H,A
	MOV  	?_fun2?BYTE+07H,A
	MOV  	R3,A
	MOV  	R2,A
	MOV  	R5,A
	MOV  	R4,A
	MOV  	R7,A
	MOV  	R6,A
	LCALL	_fun2
?C0003:
;         while (1) ;
			; SOURCE LINE # 15
	SJMP 	?C0003
	RET
; END OF main

	END

OK, let's look what we got after linking:
.obj file obtained directly from C:
LINK MAP OF MODULE:  test (MAIN)


            TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------

            * * * * * * *   D A T A   M E M O R Y   * * * * * * *
            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
            DATA    0008H     0008H     UNIT         _DATA_GROUP_
            IDATA   0010H     0001H     UNIT         ?STACK

            * * * * * * *   C O D E   M E M O R Y   * * * * * * *
            CODE    0000H     0003H     ABSOLUTE
            CODE    0003H     001EH     UNIT         ?PR?MAIN?MAIN
            CODE    0021H     000DH     UNIT         ?PR?_FUN1?MAIN
            CODE    002EH     000DH     UNIT         ?PR?_FUN2?MAIN
            CODE    003BH     000CH     UNIT         ?C_C51STARTUP



OVERLAY MAP OF MODULE:   test (MAIN)


SEGMENT                          DATA_GROUP
  +--> CALLED SEGMENT          START    LENGTH
----------------------------------------------
?C_C51STARTUP                  -----    -----
  +--> ?PR?MAIN?MAIN

?PR?MAIN?MAIN                  -----    -----
  +--> ?PR?_FUN1?MAIN
  +--> ?PR?_FUN2?MAIN

?PR?_FUN1?MAIN                 0008H    0008H

?PR?_FUN2?MAIN                 0008H    0008H

everything is great, isn't it?

But what we'll got from .obj file obtained from asm-file? We'll got this: (!)
LINK MAP OF MODULE:  test (MAIN)


            TYPE    BASE      LENGTH    RELOCATION   SEGMENT NAME
            -----------------------------------------------------

            * * * * * * *   D A T A   M E M O R Y   * * * * * * *
            REG     0000H     0008H     ABSOLUTE     "REG BANK 0"
            DATA    0008H     0008H     UNIT         ?DT?_FUN1?MAIN
            DATA    0010H     0008H     UNIT         ?DT?_FUN2?MAIN
            IDATA   0018H     0001H     UNIT         ?STACK

            * * * * * * *   C O D E   M E M O R Y   * * * * * * *
            CODE    0000H     0003H     ABSOLUTE
            CODE    0003H     001EH     UNIT         ?PR?MAIN?MAIN
            CODE    0021H     000DH     UNIT         ?PR?_FUN1?MAIN
            CODE    002EH     000DH     UNIT         ?PR?_FUN2?MAIN
            CODE    003BH     000CH     UNIT         ?C_C51STARTUP

No overlays at all!
Isn't it a memory wasting?

0