rpi_start.Sを読む (第2回)
		
	
	
つづきです。
今回読むのはここです。
read status, store registerの頭文字でしょうか。
cpsrは現在のステータスレジスタです(Current Program Status Register)。
現在のステータスレジスタをr0にロードする、ということですね。
次に進みます。
次に進みます。
先ほど下位5ビットをクリアしたr0にビットを立てています。I32_bit, F32_bit,PSR_SVC32_MODEのそれぞれです。これまたarm/include/armreg.hに定義されています。
ということで、ここでは割り込みを禁止する一連の処理をしていたようです。
		
	今回読むのはここです。
    127 	mrs	r0, cpsr
    128 	bic	r0, r0, #PSR_MODE
    129 	orr	r0, r0, #(I32_bit | F32_bit | PSR_SVC32_MODE)
    130 	msr	cpsr, r0
まず127行目。
    127 	mrs	r0, cpsr
mrsはステータスレジスタのシステムコールです。mrsはロード、msrはストア。read status, store registerの頭文字でしょうか。
cpsrは現在のステータスレジスタです(Current Program Status Register)。
現在のステータスレジスタをr0にロードする、ということですね。
次に進みます。
    128 	bic	r0, r0, #PSR_MODE
bicはビットクリアです。#PSR_MODEはarm/include/armreg.hで定義されていて下位5ビットに1が立っています。#define PSR_MODE 0x0000001f /* mode mask */ということで、r0(ステータスレジスタと同値)の下位5ビットをクリアする、ということですね。
次に進みます。
    129 	orr	r0, r0, #(I32_bit | F32_bit | PSR_SVC32_MODE)
orrは文字どおりorつまり論理和をとります。先ほど下位5ビットをクリアしたr0にビットを立てています。I32_bit, F32_bit,PSR_SVC32_MODEのそれぞれです。これまたarm/include/armreg.hに定義されています。
     62 #define I32_bit (1 << 7)	/* IRQ disable */
     63 #define F32_bit (1 << 6)	/* FIQ disable */
     77 #define PSR_SVC32_MODE	0x00000013
コメントから想像するに、割り込みを禁止するビットのようですね。
    130 	msr	cpsr, r0
最初のmrs(リード)に対するmsr(ストア)ですね。ここまでr0を操作してきた内容をステータスレジスタにストアしています。ということで、ここでは割り込みを禁止する一連の処理をしていたようです。
コメント(0件)
		- TB-URL http://www.tokuda.net/diary/0804/tb/

