View previous topic :: View next topic |
Author |
Message |
zzattack
Joined: 22 Dec 2010 Posts: 5
|
Inserting a single instruction |
Posted: Wed Dec 22, 2010 6:00 am |
|
|
I'm trying to insert a single jump instruction at address 0x100. I don't want anything at 0x101. I tried:
Code: | #org 0x100
#asm
#inline
void jump_to_prog() {
GOTO 0x300
}
#endasm |
and it generates this according to the disassembly listing:
Code: |
10: #org 0x100, 0x101
11: #inline
12: void jump_to_prog() {
13: #asm
14: GOTO 0x300
100 2B00 GOTO 0x300
15: #endasm
16: }
101 3400 RETLW 0
|
Can I prevent the RETLW instruction from being inserted? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Wed Dec 22, 2010 9:12 am |
|
|
Problem is that the syntax doesn't make sense if you think about it!...
#inline, means 'place this directly in the code sequence, without a call', but the ORG, says 'put this at this location. The latter, implies that it is called, and therefore has to have a return....
If you just want your code to jump to location 0x300, then why not just use 'goto_address(0x300)', this will be coded directly 'inline' where used, and will take you straight to the required address. If you want a NOP after the jump, then just put a delay_cycles(1) there.
Best Wishes |
|
|
zzattack
Joined: 22 Dec 2010 Posts: 5
|
|
Posted: Wed Dec 22, 2010 10:10 am |
|
|
I put the #inline there to prevent any function calls being done to this function. I don't actually want a function there, I just want this particular instruction on this exact address. Also, I want specifically nothing after this instruction, not a NOP. Flashing the compiled hex file should result in 0x101 not being touched. Can I do that? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Wed Dec 22, 2010 10:58 am |
|
|
You can put a word at a location, by just using a #ROM.
So:
#ROM 0x100={0x2B00}
Will generate the instruction you want. However '0x101', _will_ be affected, since this is the second byte of the instruction. 0x102, won't. Remember PIC instructions on a PIC16, are 14bits wide. Both address 100, and 101, are part of the one instruction....
Best Wishes |
|
|
bkamen
Joined: 07 Jan 2004 Posts: 1615 Location: Central Illinois, USA
|
|
Posted: Wed Dec 22, 2010 11:04 am |
|
|
zzattack wrote: | I put the #inline there to prevent any function calls being done to this function. I don't actually want a function there, I just want this particular instruction on this exact address. Also, I want specifically nothing after this instruction, not a NOP. Flashing the compiled hex file should result in 0x101 not being touched. Can I do that? |
Depends...
I'm going to assume you're using an 18F part?
With the 18F, the GOTO is a 2 WORD instruction.
Yes. that 32bits!
The second instruction starts with a F which is a NOP but carries 12bits of address from the previous instruction. So with the 18F's, you can't have a goto that doesn't have a following NOP. Otherwise the destination address wouldn't cover the whole 21bit address range of some 18F's. (-1 bit because each location is 2 words, so the goto is word-aligned.)
Because you didn't mention which CPU you're using... You'll want to look at the instruction summary in the datasheet for your CPU. _________________ Dazed and confused? I don't think so. Just "plain lost" will do. :D |
|
|
zzattack
Joined: 22 Dec 2010 Posts: 5
|
|
Posted: Wed Dec 22, 2010 11:43 am |
|
|
This solves my issue, thanks guys. By the way: I meant the 0x101th word on a PIC16. |
|
|
|