1
votes

I am very new to Microcontroller programming particularly PIC18F87J11, and I am using MPLAB C18 compiler. I was reading the datasheet for various topics such as saving to memory or working with timers. I noticed the examples are written in assembly language, but I have minimum experience with it. Is there a way to use the power of Assembly and C together in my project?

I do not understand assembly that good or else I would try to convert the code to C, in this case, I rather just use the assembly code with few changes.

Now can someone show me an example of how you would use an assembly function in a C program with MPLAB C18 compiler?

The assembly function can be as simple as hello world. I just need to understand the process of combing and using two different languages on MPLAB. I tried to create a quick function for testing, but I did not know where to put the assembly code. Do assembly codes need their own files included in the project?

I hope someone can enlighten me with a full simple example just to be able to see the big picture. I appropriate the help in advance, thanks!

2
there is no such things as __asm in c but if you have asm compiler you can create asm lib and use it then like here descripted: dreamincode.net/forums/topic/…cnd
Are you sure that's not possible? I was reading this book page 229 and it looks like you can do it. I tried to implement the example, but I could not do it yet. I am still looking for a simple hello world example. Thanks!Ammar
@Heather - there may be no such thing as __asm in the C standard, but most current actual C compilers do implement something of that sort, though the syntax will vary. The question does not reference the C standard, but rather a particular named compiler.Chris Stratton
@ChrisStratton I didn't knew that. Can gcc do something like that?cnd

2 Answers

5
votes

There's a way to use asm in C language, depending on the compiler you use (the capacity to use asm in C is not part of the standard). Each compiler doesn't use the same syntax. With MPLAB C18 it's something like this:

void main()
{
     _asm
                movlw 0x57
                movwf PORTB
    _endasm
}

The example above is from this link, which will explain you how to use asm in C with MPLAB C18.

2
votes

Without access to the compiler I can't test this, but the MPLAB C18 C Compiler User's Guide and Release Notes which I found here states:

2.8.2 Inline Assembly

MPLAB C18 provides an internal assembler using a syntax similar to the MPASM assembler. The block of assembly code must begin with _asm and end with _endasm. The syntax within the block is:

[label:] [<instruction> [arg1[, arg2[, arg3]]]]

...

So, it would seem to me that one solution might be to embed something like this in your .C file

void myAsmFunction()
{
  _asm
  // The asm code you've been looking at
  _endasm
}

Then call myAsmFunction from wherever appropriate. If you're wanting to include parameters and return values then it gets a little trickier.