Эта программа представляет собой простую модификацию моей предыдущей проблемы передачи по ссылке в сборке. Это вычисляет экспоненциальный ИЭ 2^2 Здесь является program--Вычисление экспоненциального значения в сборке-C с использованием LPC1769
#include<stdio.h>
#include<stdlib.h>
extern int Start_func (void);
extern int Exponentiatecore(int m,int n);
void print(int i);
int Exponentiate(int m,int n);
int main()
{
printf("in main func\n");
Start_func();
return 0;
}
int Exponentiate(int m,int n)
{
printf("in exponentiate func\n");
if(n==0)
return 1;
else
{
int result=0;
result=Exponentiatecore(m,n);
printf("calculation done\n");
printf("result=%d\n",result);
return (result);
}
}
void print(int i)
{
printf("value=%d\n",i);
}
Вот код сборки, который дополняет it--
Start_func:
mov r5,lr
mov r0,#2
mov r1,#2
bl Exponentiate
bl print
mov lr,r5
bx lr
Exponentiatecore: // r0->m, r1->n
mov r2,r0
loop:
mul r2,r0
subs r1,#1
bne loop
mov r0,r2
bx lr
Это разборку ---
Start_func:
00000270: mov r5, lr
00000272: mov.w r0, #2
00000276: mov.w r1, #2
0000027a: bl 0x2bc <Exponentiate> //branch to exponentiate function
0000027e: bl 0x31c <print>
00000282: mov lr, r5
00000284: bx lr
Exponentiatecore:
00000286: mov r2, r0
loop:
00000288: mul.w r2, r0, r2
0000028c: subs r1, #1
0000028e: bne.n 0x288 <loop>
00000290: mov r0, r2
00000292: bx lr
main:
0000029c: push {r7, lr}
0000029e: add r7, sp, #0
000002a0: movw r3, #11300 ; 0x2c24
000002a4: movt r3, #0
000002a8: mov r0, r3
000002aa: bl 0xdbc <printf>
000002ae: bl 0x270 <Start_func>
000002b2: mov.w r3, #0
000002b6: mov r0, r3
000002b8: pop {r7, pc}
000002ba: nop
Exponentiate:
000002bc: push {r7, lr}
000002be: sub sp, #16
000002c0: add r7, sp, #0
000002c2: str r0, [r7, #4]
000002c4: str r1, [r7, #0]
000002c6: movw r3, #11316 ; 0x2c34
000002ca: movt r3, #0
000002ce: mov r0, r3
000002d0: bl 0xdbc <printf>
000002d4: ldr r3, [r7, #0]
000002d6: cmp r3, #0
000002d8: bne.n 0x2e0 <Exponentiate+36>
000002da: mov.w r3, #1
000002de: b.n 0x312 <Exponentiate+86>
000002e0: mov.w r3, #0
000002e4: str r3, [r7, #12]
000002e6: ldr r0, [r7, #4]
000002e8: ldr r1, [r7, #0]
000002ea: blx 0x284 <Start_func+20> //this jump should be at 0x286
000002ee: mov r3, r0
000002f0: str r3, [r7, #12]
000002f2: movw r3, #11340 ; 0x2c4c
000002f6: movt r3, #0
000002fa: mov r0, r3
Я получаю жесткую ошибку при отладке по инструкции ->
result=Exponentiatecore(m,n);
Я использую LPC 1769 (Embedded Artists) на NXP LPC Xpresso IDE от code_red.
Если вы посмотрите на этой линии -> 000002ea: BLX 0x284
он должен перейти к 0x286, где начинается функция Exponentiatecore(), но, к сожалению, прыжок одна инструкция выше этого.
Может кто-нибудь рассказать, где я ошибаюсь в приведенном выше коде. Спасибо заранее.