4

私はインライン アセンブリがあまり得意ではありませんが、組み込みプロジェクトで最適化の目的で使用することを計画しています。私はそれについての情報をあまり知らないので、助けが必要です。

MS Visual Studio 2005 (MFC を使用) を使用して、ARM9 でWin CE 6.0を使用しています。

基本的には、メモリアクセスを高速化し、ビット単位の操作を実行したいと考えています。

オンライン リンクや、特定の環境でのレジスタ、変数名、ポインタ (メモリ転送やビット単位の操作に関連するもの) などの使用例を入手できれば、非常に役に立ちます。

ctackeの答えの後に編集:

.s ファイルを操作するためのリンクや小さな例、具体的には .s からの関数の書き込みとエクスポート、およびそれらを私の MFC アプリケーションと組み合わせる手順があれば、私にとって本当に役に立ちます。どんな小さな例でもそれを行うでしょう。

ありがとうございました。

敬具、 アフタブ

4

1 に答える 1

5

Visual Studio (すべてのバージョン) に同梱されている ARM コンパイラは、インライン ASM をサポートしていません。インライン ASM をサポートしているのは x86 コンパイラだけです。ASM for ARM (または SH または MIPS も) を使用するには、別のコード ファイル (通常は .s ファイル) を作成し、ASM から関数をエクスポートしてそれらを呼び出す必要があります。

編集

簡単な例を次に示します(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
于 2011-11-17T16:43:19.860 に答える