2017/02/19

AArch64 armasm の勉強 システムレジスタの値を取得する実習

前々回前回で、システムレジスタについてと、 C 言語から armasm のサブルーチンを呼び出す方法が分かった気がする。 なので、実際にプログラムを作成してレジスタの値が取得できるかを確かめる。

前提

この辺の作業で使った環境を引き続き使用している。

作成したプログラム

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 フラグが立ってることを確認できた???

とりあえず今日はここまで。 明日はこれでいろいろなレジスタの状態を確認していってみようか。

0 件のコメント: