XINU
03-restore

引数で指定された割り込みマスク値に cpsr レジスタを復元する。

リストア restore:ソースコード(intr.S)

restore()は、引数(r0)に割り込みマスク値(割り込み禁止 disable()などで取得していた割り込みマスク値)を取る。
restore()のソースコード中に登場する直値 0x01F00220 は、2 進数で表すと
0x01F00220 = 0b00000001111100000000001000100000
となる。この値は、ビット値の抽出(AND 演算)で用いる。

restore:
push {r1, r2} /* r1, r2をスタックに保存する(リストア中にr1, r2を使用するため) */
mrs r1, cpsr    /* cpsrの内容をr1をコピーする */
ldr r2, =0x01F00220
and r1, r1, r2 /* cpsr(r1)とr2(0x01F00220)の論理積で、関係するフラグをr1に抽出する */
bic r0, r0, r2 /* r2を反転したBit値で、割り込みマスク値(引数)の無関係なBitをクリア */
orr r1, r1, r0 /* cpsr(コピー)と割り込みマスク(引数)の論理和を取る */
msr cpsr_cfsx, r1 /* 割り込みマスク適用済みのcpsrをリストア */
pop {r1, r2} /* r1, r2をスタックから復元する */
mov pc, lr /* restore()の呼び出し元に戻る */