前々回、前回で、システムレジスタについてと、 C 言語から armasm のサブルーチンを呼び出す方法が分かった気がする。 なので、実際にプログラムを作成してレジスタの値が取得できるかを確かめる。
前提
この辺の作業で使った環境を引き続き使用している。
- 親知らずの日記: Raspberry Pi 3 Model B+ で、 OS 無し L チカした
- 親知らずの日記: Raspberry Pi 3 Model B+ でベアメタル UART 出力
- 親知らずの日記: Raspberry Pi Model B+ でベアメタル UART 出力ユーティリティ化
- 親知らずの日記: Windows 上で Raspberry Pi 3 Model B+ 64 bit の U-Boot イメージをビルド
作成したプログラム
main.c
#include <string.h>
#include <types.h>
#include <uart.h>
#include "SystemRegisters.h"
#define BUF_LENGTH 255
int main() {
char cbuf[BUF_LENGTH];
uint32 daifFlags = daif();
ltoa(daifFlags, cbuf, BUF_LENGTH, 2);
print("daifFlags = ");
println(cbuf);
uint32 nzcvFlags = nzcv();
ltoa(nzcvFlags, cbuf, BUF_LENGTH, 2);
print("nzcvFlags = ");
println(cbuf);
while (1);
return 0;
}
SystemRegisters.h
#include <types.h>
extern uint32 daif();
extern uint32 nzcv();
SystemRegisters.S
.global daif
daif:
MRS X0, DAIF
RET
.global nzcv
nzcv:
MRS X0, NZCV
RET
とりあえずこれで確認してみる。
実行結果は下記。
daifFlags = 1111000000
nzcvFlags = 1100000000000000000000000000000
printf
を実装してないから表示がちょっと残念だけど、 下記、条件フラグの記載を見る限り、 DAIF フラグが全部立ってるので、割り込みはすべて Disable であることと、 Z, C フラグが立ってることを確認できた???
とりあえず今日はここまで。 明日はこれでいろいろなレジスタの状態を確認していってみようか。