Need info on using Inline Assembly for WinCE, ARM9

I am not very good at assembly, but I plan to use it for optimization in the Embedded project. Since I do not know much information about this, I need some help.

I have Win CE 6.0 , ARM9 , using MS Visual Studio 2005 (using MFC).

Basically, I want to make access to memory faster and perform some bitwise operations.

It would be very helpful if I could get any online link or some examples of using registers, variable names, pointers (some related to data transfer and bitwise operations), etc. for my particular environment .

EDIT after ctacke's answer:

It would be very useful for me if there is any link or small examples for working with .s files, in particular, for recording and exporting functions from .s and the steps associated with combining them with my MFC application. Any small example will do this.

Thanks.

Regards, Aftab

+4
source share
1 answer

The ARM compilers shipped with Visual Studio (all versions) do not support embedded ASM โ€” only x86 compilers support embedded ASM. To use ASM for ARM (or SH or MIPS), you need to create a separate code file (usually a .s file), export functions from ASM and call them.

EDIT

Here is a simple example ( taken here ):

AREA asm_func, CODE, READONLY ; Export my_asm function location so that C compiler can find it and link EXPORT my_asm my_asm ; ; ARM Assembly language function to set LED1 bit to a value passed from C ; LED1 gets value (passed from C compiler in R0) ; LED1 is on GPIO port 1 bit 18 ; See Chapter 9 in the LPC1768 User Manual ; for all of the GPIO register info and addresses ; Pinnames.h has the mbed modules pin port and bit connections ; ; Load GPIO Port 1 base address in register R1 LDR R1, =0x2009C020 ; 0x2009C020 = GPIO port 1 base address ; Move bit mask in register R2 for bit 18 only MOV.W R2, #0x040000 ; 0x040000 = 1<<18 all "0"s with a "1" in bit 18 ; value passed from C compiler code is in R0 - compare to a "0" CMP R0, #0 ; value == 0 ? ; (If-Then-Else) on next two instructions using equal cond from the zero flag ITE EQ ; STORE if EQ - clear led 1 port bit using GPIO FIOCLR register and mask STREQ R2, [R1,#0x1C] ; if==0, clear LED1 bit ; STORE if NE - set led 1 port bit using GPIO FIOSET register and mask STRNE R2, [R1,#0x18] ; if==1, set LED1 bit ; Return to C using link register (Branch indirect using LR - a return) BX LR END 
+5
source

Source: https://habr.com/ru/post/1381741/


All Articles