Skip to main content
HMero.1
Associate
May 19, 2021
Solved

Hi I am beginning using STM32CUbe IDE and I ant to migrate a Keil uBision project where I have a code calling two ASM functions.

  • May 19, 2021
  • 4 replies
  • 1676 views

these are the functions

__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 memory

cap_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

}

The GNU compiler doesnt accept these functions

Please can you tell how to change these functions?

Best regards and thanks in advance

Horacio Merovich

This topic has been closed for replies.
Best answer by Tesla DeLorean

Honestly I despair the state of post-secondary education... is there not someone qualified to lead the course?

/* GNU/GAS Assembler code added into startup.s */
 
/* extern void my_strcpy(const char *src, char *dst); note parameters backward compared to C */
 
 .section .text.my_strcpy
 .type my_strcpy, %function
 
my_strcpy:
 
loop:
 
 LDRB r2, [r0] /* Load byte into r2 from memory pointed to by r0 (src pointer) */
 ADD r0, #1 /* Increment src pointer */
 
 STRB r2, [r1] /* Store byte in r2 into memory pointed to by (dst pointer) */
 ADD 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 */
 
.size my_strcpy, .-my_strcpy
 
 
/* extern void my_capitalize(char *str); */
 
 .section .text.my_capitalize
 .type my_capitalize, %function
 
my_capitalize:
 
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 */
 
 SUB r1,#32 /* Else subtract out difference to capitalize it */
 STRB r1, [r0] /* Store the capitalized byte back in memory */
 
cap_skip:
 
 ADD 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 */
 
.size my_capitalize, .-my_capitalize
 
/* ... */

4 replies

Pavel A.
May 19, 2021

Start by replacing this with standard C library functions, strcpy (or better strncpy) and strupr.

Optimize later, when the project is working.

-- pa

HMero.1
HMero.1Author
Associate
May 19, 2021

Thanks for your answer

This code is part of a ARM Assembler course so we dont want to use here the standard C library functions.

Best regards

Tesla DeLorean
Tesla DeLoreanBest answer
Guru
May 20, 2021

Honestly I despair the state of post-secondary education... is there not someone qualified to lead the course?

/* GNU/GAS Assembler code added into startup.s */
 
/* extern void my_strcpy(const char *src, char *dst); note parameters backward compared to C */
 
 .section .text.my_strcpy
 .type my_strcpy, %function
 
my_strcpy:
 
loop:
 
 LDRB r2, [r0] /* Load byte into r2 from memory pointed to by r0 (src pointer) */
 ADD r0, #1 /* Increment src pointer */
 
 STRB r2, [r1] /* Store byte in r2 into memory pointed to by (dst pointer) */
 ADD 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 */
 
.size my_strcpy, .-my_strcpy
 
 
/* extern void my_capitalize(char *str); */
 
 .section .text.my_capitalize
 .type my_capitalize, %function
 
my_capitalize:
 
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 */
 
 SUB r1,#32 /* Else subtract out difference to capitalize it */
 STRB r1, [r0] /* Store the capitalized byte back in memory */
 
cap_skip:
 
 ADD 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 */
 
.size my_capitalize, .-my_capitalize
 
/* ... */

Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
HMero.1
HMero.1Author
Associate
May 20, 2021

Hi

Thanks for your contribution to improve our education.

Best regards

Horacio