2011-11-17 2 views
4

Je ne suis pas très bon dans l'assemblage en ligne, mais je prévois de l'utiliser à des fins d'optimisation dans un projet Embedded. Comme je ne connais pas grand-chose à ce sujet, j'ai besoin d'aide.Besoin d'informations sur l'utilisation de Inline Assembly pour WinCE, ARM9

je rencontre Win CE 6.0, avec ARM9, en utilisant MS Visual Studio 2005 (en utilisant MFC).

Fondamentalement, je veux rendre l'accès à la mémoire plus rapide, et faire quelques opérations au niveau du bit. Il serait vraiment utile pour moi si je peux obtenir un lien en ligne, ou des exemples d'utilisation de registres, noms de variables, pointeurs (un peu de transfert de mémoire et opérations liées au bit) pour mon environnement particulier.

EDIT après la réponse de ctacke:

Il serait vraiment utile pour moi s'il y a un lien ou de petits exemples pour travailler avec des fichiers .s, écrit spécifiquement et les fonctions d'exportation de .s et étapes impliquant en les combinant avec mon application MFC. Tout petit exemple le ferait.

Merci.

Cordialement, Aftab

Répondre

5

Les compilateurs ARM livrés avec Visual Studio (toutes les versions) ne prennent pas en charge ASM en ligne - que les compilateurs x86 support ASM en ligne. Pour utiliser ASM pour ARM (ou SH ou MIPS), vous devez créer un fichier de code séparé (généralement un fichier .s), exporter les fonctions de votre ASM et les appeler.

EDIT

Voici un exemple simple (taken from 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 
+0

Merci ctacke ... Ce sera certainement utile .. – Aftab

Questions connexes