Example Routines

The following program examples show you how to pass parameters to and from assembly routines. The following C functions are used in all of these examples:
int function (
int v_a, /* passed in R6 & R7 */
char v_b, /* passed in R5 */
bit v_c, /* passed in fixed memory location */
long v_d, /* passed in fixed memory location */
bit v_e); /* passed in fixed memory location */

Small Model Example

In the small model, parameters passed in fixed memory locations are stored in internal data memory. The parameter passing segment for variables is located in the data area.

The following are two assembly code examples. The first shows how the example function is invoked from assembly. The second example displays the assembly code for the example function.

Function invocation from assembly.

.
.
.
EXTRN CODE (_function) ; Ext declarations for function names
EXTRN DATA (?_function?BYTE) ; Seg for local variables
EXTRN BIT (?_function?BIT) ; Seg for local bit variables
.
.
.
MOV R6,#HIGH intval ; int a
MOV R7,#LOW intval ; int a
MOV R7,#charconst ; char b
SETB ?_function?BIT+0 ; bit c
MOV ?_function?BYTE+3,longval+0 ; long d
MOV ?_function?BYTE+4,longval+1 ; long d
MOV ?_function?BYTE+5,longval+2 ; long d
MOV ?_function?BYTE+6,longval+3 ; long d
MOV C,bitvalue
MOV ?_function?BIT+1,C ; bit e
LCALL _function
MOV intresult+0,R6 ; store int
MOV intresult+1,R7 ; retval
.
.
.

Function implementation in assembly.

NAME			MODULE	; Names of the program module
?PR?FUNCTION?MODULE SEGMENT CODE ; Seg for prg code in 'function'
?DT?FUNCTION?MODULE SEGMENT DATA OVERLAYABLE
; Seg for local vars in 'function'
?BI?FUNCTION?MODULE SEGMENT BIT OVERLAYABLE
; Seg for local bit vars in 'function'

PUBLIC _function, ?_function?BYTE, ?_function?BIT
; Public symbols for 'C' function call

RSEG ?PD?FUNCTION?MODULE ; Segment for local variables
?_function?BYTE: ; Start of parameter passing segment
v_a: DS 2 ; int variable: v_a
v_b: DS 1 ; char variable: v_b
v_d: DS 4 ; long variable: v_d
.
. ; Additional local variables
.

RSEG ?BI?FUNCTION?MODULE ; Segment for local bit variables
?_function?BIT: ; Start of parameter passing segment
v_c: DBIT 1 ; bit variable: v_c
v_e: DBIT 1 ; bit variable: v_e
.
. ; Additional local bit variables
.

RSEG ?PR?FUNCTION?MODULE ; Program segment
_function: MOV v_a,R6 ; A function prolog and epilog is
MOV v_a+1,R7 ; not necessary. All variables can
MOV v_b,R5 ; immediately be accessed.
.
.
.
MOV R6,#HIGH retval ; Return value
MOV R7,#LOW retval ; int constant
RET ; Return

Compact Model Example

In the compact model, parameters passed in fixed memory locations are stored in external data memory. The parameter passing segment for variables is located in the pdata area.

The following are two assembly code examples. The first shows how the example function is invoked from assembly. The second example displays the assembly code for the example function.

Function invocation from assembly.

EXTRN  CODE	(_function)	; Ext declarations for function names
EXTRN XDATA (?_function?BYTE) ; Seg for local variables
EXTRN BIT (?_function?BIT) ; Seg for local bit variables
.
.
.
MOV R6,#HIGH intval ; int a
MOV R7,#LOW intval ; int a
MOV R5,#charconst ; char b
SETB ?_function?BIT+0 ; bit c
MOV R0,#?_function?BYTE+3 ; Addr of 'v_d' in the passing area
MOV A,longval+0 ; long d
MOVX @R0,A ; Store parameter byte
INC R0 ; Inc parameter passing address
MOV A,longval+1 ; long d
MOVX @R0,A ; Store parameter byte
INC R0 ; Inc parameter passing address
MOV A,longval+2 ; long d
MOVX @R0,A ; Store parameter byte
INC R0 ; Inc parameter passing address
MOV A,longval+3 ; long d
MOVX @R0,A ; Store parameter byte
MOV C,bitvalue
MOV ?_function?BIT+1,C ; bit e
LCALL _function
MOV intresult+0,R6 ; Store int
MOV intresult+1,R7 ; Retval
.
.
.

Function implementation in assembly.

NAME			MODULE	; Name of the program module
?PR?FUNCTION?MODULE SEGMENT CODE ; Seg for program code in 'function';
?PD?FUNCTION?MODULE SEGMENT XDATA OVERLAYABLE IPAGE
; Seg for local vars in 'function'
?BI?FUNCTION?MODULE SEGMENT BIT OVERLAYABLE
; Seg for local bit vars in 'function'

PUBLIC _function, ?_function?BYTE, ?_function?BIT
; Public symbols for "C" function call

RSEG ?PD?FUNCTION?MODULE ; Segment for local variables
?_function?BYTE: ; Start of the parameter passing seg
v_a: DS 2 ; int variable: v_a
v_b: DS 1 ; char variable: v_b
v_d: DS 4 ; long variable: v_d
.
. ; Additional local variables
.

RSEG ?BI?FUNCTION?MODULE ; Segment for local bit variables
?_function?BIT: ; Start of the parameter passing seg
v_c: DBIT 1 ; bit variable: v_c
v_e: DBIT 1 ; bit variable: v_e
.
. ; Additional local bit variables
.

RSEG ?PR?FUNCTION?MODULE ; Program segment
_function: MOV R0,#?_function?BYTE+0 ; Special function prolog
MOV A,R6 ; and epilog is not
MOVX @R0,A ; necessary. All
INC R0 ; vars can immediately
MOV A,R7 ; be accessed
MOVX @R0,A
INC R0
MOV A,R5
MOVX @R0,A
.
.
.
MOV R6,#HIGH retval ; Return value
MOV R7,#LOW retval ; int constant
RET ; Return

Large Model Example

In the large model, parameters passed in fixed memory locations are stored in external data memory. The parameter passing segment for variables is located in the xdata area.

The following are two assembly code examples. The first shows how the example function is invoked from assembly. The second example displays the assembly code for the example function.

Function invocation from assembly.

EXTRN  CODE	(_function)	; Ext declarations for function names
EXTRN XDATA (?_function?BYTE) ; Start of transfer for local vars
EXTRN BIT (?_function?BIT) ; Start of transfer for local bit vars
.
.
.
MOV R6,#HIGH intval ; int a
MOV R7,#LOW intval ; int a
MOV R5,#charconst ; char b
SETB ?_function?BIT+0 ; bit c
MOV R0,#?_function?BYTE+3 ; Address of 'v_d' in the passing area
MOV A,longval+0 ; long d
MOVX @DPTR,A ; Store parameter byte
INC DPTR ; Increment parameter passing address
MOV A,longval+1 ; long d
MOVX @DPTR,A ; Store parameter byte
INC DPTR ; Increment parameter passing address
MOV A,longval+2 ; long d
MOVX @DPTR,A ; Store parameter byte
INC DPTR ; Increment parameter passing address
MOV A,longval+3 ; long d
MOVX @DPTR,A ; Store parameter byte
MOV C,bitvalue
MOV ?_function?BIT+1,C ; bit e
LCALL _function
MOV intresult+0,R6 ; Store int
MOV intresult+1,R7 ; Retval
.
.
.

Function implementation in assembly.

NAME			MODULE	; Name of the program module
?PR?FUNCTION?MODULE SEGMENT CODE ; Seg for program code in 'functions'
?XD?FUNCTION?MODULE SEGMENT XDATA OVERLAYABLE
; Seg for local vars in 'function'
?BI?FUNCTION?MODULE SEGMENT BIT OVERLAYABLE
; Seg for local bit vars in 'function'

PUBLIC _function, ?_function?BYTE, ?_function?BIT
; Public symbols for 'C' function call

RSEG ?XD?FUNCTION?MODULE ; Segment for local variables
?_function?BYTE: ; Start of the parameter passing seg
v_a: DS 2 ; int variable: v_a
v_b: DS 1 ; char variable: v_b
v_d: DS 4 ; long variable: v_l
.
.; Additional local variables from 'function'
.

RSEG ?BI?FUNCTION?MODULE ; Segment for local bit variables
?_function?BIT: ; Start of the parameter passing seg
v_c: DBIT 1 ; bit variable: v_c
v_e: DBIT 1 ; bit variable: v_e
.
. ; Additional local bit variables
.

RSEG ?PR?FUNCTION?MODULE ; Program segment
_function: MOV DPTR,#?_function?BYTE+0 ; Special function prolog
MOV A,R6 ; and epilog is not
MOVX @DPTR,A ; necessary. All vars
INC R0 ; can immediately be
MOV A,R7 ; accessed.
MOVX @DPTR,A
INC R0
MOV A,R5
MOVX @DPTR,A
.
.
.
MOV R6,#HIGH retval ; Return value
MOV R7,#LOW retval ; int constant
RET ; Return