Jump to content


Inline Assembly - Accessing Each Byte Of An Int?


5 replies to this topic

#1 kenh

    Newbrie

  • Members
  • 5 posts

Posted 07 February 2007 - 08:18 PM

Hello,

I would like to ask if it is possible to reference the individual bytes of an int from an inline assembly asm {} block, and if so, what is the syntax?

One example where this would be useful is to optimize the capture of Timer1 values to an unsigned int variable

e.g.

unsigned int x;
x = (tmr1h<<8)+tmr1l;

I would like to be able to write something like

asm
{
movf _tmr1h, W
movwf _x.h
movf _tmr1l, W
movwf _x.l
}

I have tried various approaches with struct/unions and pointers, but without success.

Edited by kenh, 07 February 2007 - 10:39 PM.


#2 kenh

    Newbrie

  • Members
  • 5 posts

Posted 07 February 2007 - 10:49 PM

Found the solution in another thread....add +1 to the variable name.

i.e.

asm
{
movf _tmr1h, W
movwf _x+1
movf _tmr1l, W
movwf _x
}

I would suggest adding this to the inline assembler section of the BoostC manual.

#3 cac001

    Enthusiast

  • EstablishedMember
  • PipPip
  • 183 posts
  • Location:USA, left coast
  • Interests:31.99%

Posted 08 February 2007 - 06:29 AM

You are not trying hard enough for a C only solution.

typedef union {
unsigned int ui;
unsigned char b&#91;2&#93;;
} noportable_int;

//main program starts here.    
void main&#40;&#41;

{
noportable_int n;

 n.ui = 0x1234;
00AF  3034 	 MOVLW 0x34
00B0  1283 	 BCF STATUS, RP0
00B1  1303 	 BCF STATUS, RP1
00B2  00AD 	 MOVWF main_1_n
00B3  3012 	 MOVLW 0x12
00B4  00AE 	 MOVWF main_1_n+D&#39;1&#39;

 n.b&#91;0&#93; = tmr1l;
00B5  080E 	 MOVF gbl_tmr1l, W
00B6  00AD 	 MOVWF main_1_n

 n.b&#91;1&#93; = tmr1h;
00B7  080F 	 MOVF gbl_tmr1h, W
00B8  00AE 	 MOVWF main_1_n+D&#39;1&#39;

}


#4 kenh

    Newbrie

  • Members
  • 5 posts

Posted 08 February 2007 - 06:10 PM

Very nice. Thank you.

And the bytes can be accessed from assembly using _n and _n+1 if required.

#5 edt

    Regular

  • EstablishedMember
  • Pip
  • 64 posts

Posted 09 February 2007 - 04:10 PM

Hmm...that's quite a hack. I expected BoostC to recognize "(x_H << 8) | x_L" and copy the bytes since it recognizes shifts by 8. I wouldn't want to uglify the C source for such a small gain. I guess if you use it enough...

BTW, I hope you know to stop the timer before reading from it or take precautions. If it increments from 0x0FF to 0x100 between HI and LO reads, you'll read 0x000 or 0x1FF (for HI first and LO first, respectively). Maybe that won't matter in your application.

#6 cac001

    Enthusiast

  • EstablishedMember
  • PipPip
  • 183 posts
  • Location:USA, left coast
  • Interests:31.99%

Posted 09 February 2007 - 07:12 PM

Yes, it's an ugly, nonportable hack.

The shift operators work fine for unsigned 16-bit data types.

They do get strange with 32-bit data types.

This is the result of a 24-bit shift right:
unsigned char wildone &#40;unsigned long in&#41;

{
  unsigned char out;
  out = &#40;unsigned char&#41;&#40;in >> 24&#41;;
006A  082E 	 MOVF wildone_00000_arg_in, W
006B  00B3 	 MOVWF CompTempVar98
006C  082F 	 MOVF wildone_00000_arg_in+D&#39;1&#39;, W
006D  00B4 	 MOVWF CompTempVar99
006E  0830 	 MOVF wildone_00000_arg_in+D&#39;2&#39;, W
006F  00B5 	 MOVWF CompTempVar100
0070  0831 	 MOVF wildone_00000_arg_in+D&#39;3&#39;, W
0071  00B6 	 MOVWF CompTempVar101
0072  1003 	 BCF STATUS,C
0073  0CB6 	 RRF CompTempVar101, F
0074  0CB5 	 RRF CompTempVar100, F
0075  0CB4 	 RRF CompTempVar99, F
0076  0CB3 	 RRF CompTempVar98, F
0077  1003 	 BCF STATUS,C
0078  0CB6 	 RRF CompTempVar101, F
0079  0CB5 	 RRF CompTempVar100, F
007A  0CB4 	 RRF CompTempVar99, F
007B  0CB3 	 RRF CompTempVar98, F
007C  1003 	 BCF STATUS,C
007D  0CB6 	 RRF CompTempVar101, F
007E  0CB5 	 RRF CompTempVar100, F
007F  0CB4 	 RRF CompTempVar99, F
0080  0CB3 	 RRF CompTempVar98, F
0081  1003 	 BCF STATUS,C
0082  0CB6 	 RRF CompTempVar101, F
0083  0CB5 	 RRF CompTempVar100, F
0084  0CB4 	 RRF CompTempVar99, F
0085  0CB3 	 RRF CompTempVar98, F
0086  1003 	 BCF STATUS,C
0087  0CB6 	 RRF CompTempVar101, F
0088  0CB5 	 RRF CompTempVar100, F
0089  0CB4 	 RRF CompTempVar99, F
008A  0CB3 	 RRF CompTempVar98, F
008B  1003 	 BCF STATUS,C
008C  0CB6 	 RRF CompTempVar101, F
008D  0CB5 	 RRF CompTempVar100, F
008E  0CB4 	 RRF CompTempVar99, F
008F  0CB3 	 RRF CompTempVar98, F
0090  1003 	 BCF STATUS,C
0091  0CB6 	 RRF CompTempVar101, F
0092  0CB5 	 RRF CompTempVar100, F
0093  0CB4 	 RRF CompTempVar99, F
0094  0CB3 	 RRF CompTempVar98, F
0095  1003 	 BCF STATUS,C
0096  0CB6 	 RRF CompTempVar101, F
0097  0CB5 	 RRF CompTempVar100, F
0098  0CB4 	 RRF CompTempVar99, F
0099  0CB3 	 RRF CompTempVar98, F
009A  1003 	 BCF STATUS,C
009B  0CB6 	 RRF CompTempVar101, F
009C  0CB5 	 RRF CompTempVar100, F
009D  0CB4 	 RRF CompTempVar99, F
009E  0CB3 	 RRF CompTempVar98, F
009F  1003 	 BCF STATUS,C
00A0  0CB6 	 RRF CompTempVar101, F
00A1  0CB5 	 RRF CompTempVar100, F
00A2  0CB4 	 RRF CompTempVar99, F
00A3  0CB3 	 RRF CompTempVar98, F
00A4  1003 	 BCF STATUS,C
00A5  0CB6 	 RRF CompTempVar101, F
00A6  0CB5 	 RRF CompTempVar100, F
00A7  0CB4 	 RRF CompTempVar99, F
00A8  0CB3 	 RRF CompTempVar98, F
00A9  1003 	 BCF STATUS,C
00AA  0CB6 	 RRF CompTempVar101, F
00AB  0CB5 	 RRF CompTempVar100, F
00AC  0CB4 	 RRF CompTempVar99, F
00AD  0CB3 	 RRF CompTempVar98, F
00AE  1003 	 BCF STATUS,C
00AF  0CB6 	 RRF CompTempVar101, F
00B0  0CB5 	 RRF CompTempVar100, F
00B1  0CB4 	 RRF CompTempVar99, F
00B2  0CB3 	 RRF CompTempVar98, F
00B3  1003 	 BCF STATUS,C
00B4  0CB6 	 RRF CompTempVar101, F
00B5  0CB5 	 RRF CompTempVar100, F
00B6  0CB4 	 RRF CompTempVar99, F
00B7  0CB3 	 RRF CompTempVar98, F
00B8  1003 	 BCF STATUS,C
00B9  0CB6 	 RRF CompTempVar101, F
00BA  0CB5 	 RRF CompTempVar100, F
00BB  0CB4 	 RRF CompTempVar99, F
00BC  0CB3 	 RRF CompTempVar98, F
00BD  1003 	 BCF STATUS,C
00BE  0CB6 	 RRF CompTempVar101, F
00BF  0CB5 	 RRF CompTempVar100, F
00C0  0CB4 	 RRF CompTempVar99, F
00C1  0CB3 	 RRF CompTempVar98, F
00C2  1003 	 BCF STATUS,C
00C3  0CB6 	 RRF CompTempVar101, F
00C4  0CB5 	 RRF CompTempVar100, F
00C5  0CB4 	 RRF CompTempVar99, F
00C6  0CB3 	 RRF CompTempVar98, F
00C7  1003 	 BCF STATUS,C
00C8  0CB6 	 RRF CompTempVar101, F
00C9  0CB5 	 RRF CompTempVar100, F
00CA  0CB4 	 RRF CompTempVar99, F
00CB  0CB3 	 RRF CompTempVar98, F
00CC  1003 	 BCF STATUS,C
00CD  0CB6 	 RRF CompTempVar101, F
00CE  0CB5 	 RRF CompTempVar100, F
00CF  0CB4 	 RRF CompTempVar99, F
00D0  0CB3 	 RRF CompTempVar98, F
00D1  1003 	 BCF STATUS,C
00D2  0CB6 	 RRF CompTempVar101, F
00D3  0CB5 	 RRF CompTempVar100, F
00D4  0CB4 	 RRF CompTempVar99, F
00D5  0CB3 	 RRF CompTempVar98, F
00D6  1003 	 BCF STATUS,C
00D7  0CB6 	 RRF CompTempVar101, F
00D8  0CB5 	 RRF CompTempVar100, F
00D9  0CB4 	 RRF CompTempVar99, F
00DA  0CB3 	 RRF CompTempVar98, F
00DB  1003 	 BCF STATUS,C
00DC  0CB6 	 RRF CompTempVar101, F
00DD  0CB5 	 RRF CompTempVar100, F
00DE  0CB4 	 RRF CompTempVar99, F
00DF  0CB3 	 RRF CompTempVar98, F
00E0  1003 	 BCF STATUS,C
00E1  0CB6 	 RRF CompTempVar101, F
00E2  0CB5 	 RRF CompTempVar100, F
00E3  0CB4 	 RRF CompTempVar99, F
00E4  0CB3 	 RRF CompTempVar98, F
00E5  1003 	 BCF STATUS,C
00E6  0CB6 	 RRF CompTempVar101, F
00E7  0CB5 	 RRF CompTempVar100, F
00E8  0CB4 	 RRF CompTempVar99, F
00E9  0C33 	 RRF CompTempVar98, W
00EA  00B2 	 MOVWF wildone_00000_1_out

  return &#40;out&#41;;
00EB  0832 	 MOVF wildone_00000_1_out, W
00EC  00B3 	 MOVWF CompTempVarRet97

}
00ED  0008 	 RETURN

Edited by cac001, 09 February 2007 - 07:16 PM.





Reply to this topic


This post will need approval from a moderator before this post is shown.

  


1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users