Calling Assembly Functions From C. Cypress Semiconductor CY8C24423

Add to My manuals
162 Pages

advertisement

Calling Assembly Functions From C. Cypress Semiconductor CY8C24423 | Manualzz

Assembler

The Output Status (or error-tracking) window of Code Editor is where the status of file compiling and assembling resides. Each time you compile and assemble files, the Output Status window is cleared and the current status is entered as the process occurs.

Figure 5-1. Output Status Window

5.8

When compiling is complete, you the see the number of errors. Zero errors signify that the compilation and assemblage was successful. One or more errors indicate problems with one or more files.

This process reveals syntax errors. Such errors include missing input data and undeclared identifier . For a list of all identified compile (and build) errors with solutions see the PSoC

Designer Assembly Language User Guide. For further details on compiling and building see

“Building a Project” on page 103

in this guide.

At any time you can ensure a clean compile and assemble (or build) by accessing Project > Clean, then clicking the Compile/Assemble or Build icon. The “clean” deletes all lib\libPSoc.a, obj\*.o

, and lib\obj\*.o files. These files are regenerated upon a compile or build (in addition to normal compile and build activity).

Calling Assembly Functions From C

When one C function calls another, the compiler uses a simple layout for passing arguments that the caller and callee use to initialize and the access the values. Although you can use the same layout when a C function calls an assembly language routine, it is best to use of the alternate fastcall16 calling convention. Fastcall16 is directly supported by the C compiler though use of a pragma directive and is often more efficient than the convention used by C. In fact, fastcall16 is identical to the C calling convention except for simple cases when the parameters are passed and/or returned in the

CPU A and X registers. All user module API functions implement the fastcall16 interface for this reason.

There are four conditions to meet when using the fastcall16 interface:

The function must be tagged with a C #pragma fastcall16 directive

The function needs a C function prototype

The assembly function name must be the C function name prefixed with an underscore character (_).

The assembly function name must be exported.

100 PSoC Designer IDE Guide, Document # 001-42655 Rev *B

Assembler

For example, an assembly function that is passed a single byte as a parameter and has no return value looks like this:

C function declaration (typically in a .h header file)

#pragma fastcall16 send_byte void send_byte( char val);

C function call (in a .c file) send_byte( 0x37);

Assembly function definition (in an .asm file) export _send_byte

; Fastcall16 inputs (single byte)

; A – data value

; Fastcall16 return value (none)

_send_byte: mov reg[ PRT1DR],A ret

An assembly function that is passed two bytes and returns one byte might look like this:

C function declaration (typically in a .h header file)

#pragma fastcall16 read_indexed_reg char read_indexed_reg( char bank, char index);

C function call (in a .c file) val = read_indexed_reg( 0x01, index);

Assembly function definition (in an .asm file) export read_indexed_reg

; Read byte from specified IO register

; Fastcall16 inputs (two single bytes)

; A – bank number (0 or non-zero)

; X – register number

; Fastcall16 return value (single byte)

; A – read data

_read_indexed_reg:

cpl A

jnz get_data:

or F, FLAG_XIO_MASK; switch to bank 1 get_data:

mov A, reg[X]

and F, ~FLAG_XIO_MASK; make sure we’re in bank 0

ret

PSoC Designer IDE Guide, Document # 001-42655 Rev *B 101

Assembler

Functions with more complex input parameters or return values can be written using these tables.

Table 5-6. Pragma Fastcall16 Conventions for Argument Passing

Argument Type

Single Byte

Two Single Bytes

Double Byte

Pointer

All Others

A

A, X

X, A

A, X

Register

None

Argument Register

The argument is passed in A.

The first argument is passed in A, the second in X.

The MSB is passed in X, the LSB in A.

The MSB is passed in A, the LSB in X.

Arguments are stored on the stack in standard byte order and in reverse order or appearance. In other words, the MSB of the last actual parameter is pushed first and the LSB of the first actual parameter is pushed last.

Table 5-7. Pragma Fastcall16 Conventions for Return Value

Return Type

Single Byte

Double Byte

Pointer

All Others

A

X, A

A, X

Return

Register

None

Comment

The argument is returned in A.

The MSB is passed in X, the LSB in A.

The MSB is passed in A, the LSB in X.

Use a pass-by-reference parameter or global variable instead of returning arguments longer than 16 bits.

Note that the #pragma fastcall16 has replaced #pragma fastcall and use of #pragma fastcall is deprecated.

102 PSoC Designer IDE Guide, Document # 001-42655 Rev *B

advertisement

Related manuals

advertisement

Table of contents