#include "MKL25Z4.h" // Device header
__asm void my_strcpy(const char *src, char *dst) {loop LDRB r2, [r0] //; Load byte into r2 from memory pointed to by r0 (src pointer) ADDS r0, #1 //; Increment src pointer STRB r2, [r1] //; Store byte in r2 into memory pointed to by (dst pointer) ADDS r1, #1 //; Increment dst pointer CMP r2, #0 //; Was the byte 0? BNE loop //; If not, repeat the loop BX lr //; Else return from subroutine }__asm void my_capitalize(char *str){cap_loop LDRB r1,[r0] //; Load byte into r1 from memory pointed to by r0 (str pointer) CMP r1, #'a'-1 //; compare it with the character before 'a' BLS cap_skip //; If byte is lower or same, then skip this byte CMP r1, #'z' //; Compare it with the 'z' character BHI cap_skip //; If it is higher, then skip this byte SUBS r1,#32 //; Else subtract out difference to capitalize it STRB r1,[r0] //; Store the capitalized byte back in memorycap_skip ADDS r0, r0, #1 //; Increment str pointer CMP r1, #0 //; Was the byte 0? BNE cap_loop //; If not, repeat the loop BX lr //; Else return from subroutine}
int main(void){ const char a[] = "Hello world!"; char b[20];
my_strcpy (a, b); my_capitalize(b); while (1);}
///////////////////////////////////
Lab Instructions...We will use MDK with a C program, but add assembly language subroutines to perform the string copy and capitalization operations. Some embedded systems are coded purely in assembly language, but most are coded in C and resort to assembly language only for time-critical processing.
That doesn't say that the "assembly language subroutines" have to be coded as inline assembler in a 'C' source file.
Again, why not code them as proper assembler in proper assembler source files - and then link to your 'C' code ?
You need to discuss this with your teacher to clarify the Lab instructions - nobody else can do that for you!