2011-11-17 1 views
4

인라인 어셈블리가 좋지 않지만 임베디드 프로젝트의 최적화 용도로 사용할 계획입니다. 내가 그것에 관해 많은 정보를 모르기 때문에 나는 도움이 필요합니다.인라인 어셈블리를 WinCE, ARM9 용으로 사용하는 방법에 대한 정보가 필요합니다.

나는 2005 (MFC 사용) MS 비주얼 스튜디오를 사용하여, ARM9으로, 윈 CE 6.0을 데.

기본적으로 메모리 액세스 속도를 높이고 비트 연산을 수행하려고합니다. 내 특정 환경에 대한 모든 온라인 링크 또는 레지스터, 변수 이름, 포인터 사용의 예 (일부 메모리 전송 및 비트 연산과 관련된 물건) 등 를 얻을 수 있다면

그것은 나에게 정말 도움이 될 것입니다. ctacke의 대답 후

편집 :

구체적으로 작성하고 .S에서 기능을 내보내기 및 단계를 포함하는, .S 파일을 해결하기 위해 어떤 링크 나 작은 사례가 있다면 나에게 정말 도움이 될 것입니다 그들을 내 MFC 응용 프로그램과 결합합니다. 작은 예제가 그것을 할 것입니다.

감사합니다.

친절 감사, 아프 탑

답변

5

인라인 ASM을 지원하지 않는 비주얼 스튜디오 (모든 버전) 함께 제공되는 ARM 컴파일러 - 만 86 컴파일러 지원 인라인 ASM. ARM (또는 SH 또는 MIPS) 용 ASM을 사용하려면 별도의 코드 파일 (일반적으로 .s 파일)을 작성하고 ASM에서 함수를 내보내고 호출해야합니다. ...이 확실히 도움이 될 것입니다 ctacke

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

감사합니다 .. :

EDIT 다음은 간단한 예제 (taken from here)입니다 – Aftab

관련 문제