<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: pass by reference in arm assembly in LPCXpresso IDE</title>
    <link>https://community.nxp.com/t5/LPCXpresso-IDE/pass-by-reference-in-arm-assembly/m-p/590666#M29232</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by wrighflyer on Thu Mar 21 02:28:36 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Why not simply write a stub version of Exponentiatecore() in C, compile with -save-temps and then use the .s file as the basis of what you want to do?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 15 Jun 2016 22:49:26 GMT</pubDate>
    <dc:creator>lpcware</dc:creator>
    <dc:date>2016-06-15T22:49:26Z</dc:date>
    <item>
      <title>pass by reference in arm assembly</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/pass-by-reference-in-arm-assembly/m-p/590665#M29231</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by venkateshkuppan on Thu Mar 21 01:33:02 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;I am trying to write a program to calculate the exponential of a number using ARM-C inter-working. I am using LPC1769(cortex m3) for debuuging.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt; The following is the code:&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;/*here is the main.c file*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#include&amp;lt;stdio.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include&amp;lt;stdlib.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;extern int Start (void);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;extern int Exponentiatecore(int *m,int *n);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;void print(int i);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;int Exponentiate(int *m,int *n);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;int main()&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Start();&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;return 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;int Exponentiate(int *m,int *n)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (*n==0)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int result;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result=Exponentiatecore(m,n);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (result);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;void print(int i)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;printf("value=%d\n",i);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;this is the assembly code which complements the above C code&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;.syntax unified&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .cpu cortex-m3&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .thumb&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .align&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .global Start&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .global Exponentiatecore&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .thumb&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .thumb_func&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Start:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov r10,lr&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr r0,=label1&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr r1,=label2&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bl Exponentiate&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bl print&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov lr,r10&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov pc,lr&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Exponentiatecore:&amp;nbsp;&amp;nbsp;&amp;nbsp; // r0-&amp;amp;m, r1-&amp;amp;n&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;ldr r4,[r0]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ldr r2,[r1]&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;loop:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;mul r4,r4&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;sub r2,#1&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;bne loop&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;mov r0,r4&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;mov pc,lr&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;label1:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;.word 0x02&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;label2:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;.word 0x03&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;however during the debug session, I encounter a Hardfault error for the execution of "Exponentiatecore(m,n)".&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;as seen in debug window.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Name : HardFault_Handler&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Details:{void (void)} 0x21c &amp;lt;HardFault_Handler&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Default:{void (void)} 0x21c &amp;lt;HardFault_Handler&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Decimal:&amp;lt;error reading variable&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Hex:&amp;lt;error reading variable&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Binary:&amp;lt;error reading variable&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Octal:&amp;lt;error reading variable&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;Am I making some stack corruption during alignment or is there a mistake in my interpretation? please kindly help. thankyou in advance&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:49:25 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/pass-by-reference-in-arm-assembly/m-p/590665#M29231</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:49:25Z</dc:date>
    </item>
    <item>
      <title>Re: pass by reference in arm assembly</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/pass-by-reference-in-arm-assembly/m-p/590666#M29232</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by wrighflyer on Thu Mar 21 02:28:36 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Why not simply write a stub version of Exponentiatecore() in C, compile with -save-temps and then use the .s file as the basis of what you want to do?&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:49:26 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/pass-by-reference-in-arm-assembly/m-p/590666#M29232</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:49:26Z</dc:date>
    </item>
    <item>
      <title>Re: pass by reference in arm assembly</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/pass-by-reference-in-arm-assembly/m-p/590667#M29233</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by frame on Thu Mar 21 08:11:13 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;HR /&gt;&lt;SPAN style="color: #0000ff;"&gt;&lt;STRONG&gt;Quote: &lt;/STRONG&gt;&lt;BR /&gt;Why not simply write a stub version of Exponentiatecore() in C, compile&amp;nbsp; with -save-temps and then use the .s file as the basis of what you want&amp;nbsp; to do?&lt;/SPAN&gt;&lt;HR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;I agree.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&lt;SPAN&gt;Whereby, I believe any decent compiler will keep up with your asm coding capabilities, or even beat you ...[IMG]&lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fknowledgebase.nxp.com%2Fimages%2Ficons%2Ficon7.gif%5B%2FIMG%5D" rel="nofollow" target="_blank"&gt;http://knowledgebase.nxp.com/images/icons/icon7.gif[/IMG]&lt;/A&gt;&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:49:27 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/pass-by-reference-in-arm-assembly/m-p/590667#M29233</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:49:27Z</dc:date>
    </item>
    <item>
      <title>Re: pass by reference in arm assembly</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/pass-by-reference-in-arm-assembly/m-p/590668#M29234</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by wrighflyer on Thu Mar 21 08:47:51 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;What I meant was something like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;__attribute__((noinline)) int Exponentiatecore(int *m,int *n) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; *m = *m * *n;
}

int m,n;

int main (void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; m = 37; n = 56;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Exponentiatecore(&amp;amp;m, &amp;amp;n);
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;when compiled the C compiler generated:&lt;/SPAN&gt;&lt;BR /&gt;&lt;TABLE border="1"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD bgcolor="#cacaca"&gt; &lt;PRE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .section&amp;nbsp;&amp;nbsp;&amp;nbsp; .text.Exponentiatecore,"ax",%progbits
&amp;nbsp;&amp;nbsp;&amp;nbsp; .align&amp;nbsp;&amp;nbsp;&amp;nbsp; 2
&amp;nbsp;&amp;nbsp;&amp;nbsp; .global&amp;nbsp;&amp;nbsp;&amp;nbsp; Exponentiatecore
&amp;nbsp;&amp;nbsp;&amp;nbsp; .thumb
&amp;nbsp;&amp;nbsp;&amp;nbsp; .thumb_func
&amp;nbsp;&amp;nbsp;&amp;nbsp; .type&amp;nbsp;&amp;nbsp;&amp;nbsp; Exponentiatecore, %function
Exponentiatecore:
.LFB178:
&amp;nbsp;&amp;nbsp;&amp;nbsp; .file 1 "../src/main.c"
&amp;nbsp;&amp;nbsp;&amp;nbsp; .loc 1 21 0
&amp;nbsp;&amp;nbsp;&amp;nbsp; .cfi_startproc
&amp;nbsp;&amp;nbsp;&amp;nbsp; @ args = 0, pretend = 0, frame = 0
&amp;nbsp;&amp;nbsp;&amp;nbsp; @ frame_needed = 0, uses_anonymous_args = 0
&amp;nbsp;&amp;nbsp;&amp;nbsp; @ link register save eliminated.
.LVL0:
&amp;nbsp;&amp;nbsp;&amp;nbsp; .loc 1 22 0
&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [r0, #0]
&amp;nbsp;&amp;nbsp;&amp;nbsp; ldr&amp;nbsp;&amp;nbsp;&amp;nbsp; r2, [r1, #0]
&amp;nbsp;&amp;nbsp;&amp;nbsp; mul&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, r2, r3
&amp;nbsp;&amp;nbsp;&amp;nbsp; str&amp;nbsp;&amp;nbsp;&amp;nbsp; r3, [r0, #0]
.LVL1:
&amp;nbsp;&amp;nbsp;&amp;nbsp; .loc 1 23 0
&amp;nbsp;&amp;nbsp;&amp;nbsp; bx&amp;nbsp;&amp;nbsp;&amp;nbsp; lr
&amp;nbsp;&amp;nbsp;&amp;nbsp; .cfi_endproc
.LFE178:
&amp;nbsp;&amp;nbsp;&amp;nbsp; .size&amp;nbsp;&amp;nbsp;&amp;nbsp; Exponentiatecore, .-Exponentiatecore
&lt;/PRE&gt; &lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;BR /&gt;&lt;SPAN&gt;So clearly &amp;amp;m and &amp;amp;n are passed in r0 and r1 (which is the EABI). You can now just replace this C compiler generated code with your own solution between .LVL0: and .LFE178: and it should just work.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:49:27 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/pass-by-reference-in-arm-assembly/m-p/590668#M29234</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:49:27Z</dc:date>
    </item>
    <item>
      <title>Re: pass by reference in arm assembly</title>
      <link>https://community.nxp.com/t5/LPCXpresso-IDE/pass-by-reference-in-arm-assembly/m-p/590669#M29235</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;STRONG&gt;Content originally posted in LPCWare by venkateshkuppan on Thu Mar 21 13:08:05 MST 2013&lt;/STRONG&gt;&lt;BR /&gt;&lt;SPAN&gt;Thanks a lot wrighflyer. It's indeed a great way to attack the problem. :D&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The program works fine till the execution of this line &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;"result = Exponentiatecore(m,n);". I think I am corrupting either the value of link register(lr) or Stack pointer(SP). This might be occurring due to the multiple switching the program does from C to assembly and assembly to C. &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Here is a description.....&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#1 from C --&amp;gt; #2 assembly(Start routine) --&amp;gt;#3 C function (exponentiate) --&amp;gt;#4 assembly (Exponentiatecore) --&amp;gt; accordingly the rewind :)&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;is this the exact problem? any solutions on how I can prevent it? thanks in advance&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 15 Jun 2016 22:49:28 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPCXpresso-IDE/pass-by-reference-in-arm-assembly/m-p/590669#M29235</guid>
      <dc:creator>lpcware</dc:creator>
      <dc:date>2016-06-15T22:49:28Z</dc:date>
    </item>
  </channel>
</rss>

