2016-09-11 6 views
2

私はRISC-Vテストパターンのソースコードを読んでいました。 そしてマクロが、私は1:は、このコードでは意味ないかを知りたい、riscv-TE​​ST.Hにアセンブリ言語で1とは何ですか?

を定義している:

#define RVTEST_CODE_BEGIN            \ 
     .section .text.init;           \ 
     .align 6;              \ 
     .weak stvec_handler;           \ 
     .weak mtvec_handler;           \ 
     .globl _start;             \ 
_start:                 \ 
     /* reset vector */            \ 
     j reset_vector;             \ 
     .align 2;              \ 
trap_vector:               \ 
     /* test whether the test came from pass/fail */     \ 
     csrr t5, mcause;            \ 
     li t6, CAUSE_USER_ECALL;          \ 
     beq t5, t6, write_tohost;          \ 
     li t6, CAUSE_SUPERVISOR_ECALL;         \ 
     beq t5, t6, write_tohost;          \ 
     li t6, CAUSE_MACHINE_ECALL;          \ 
     beq t5, t6, write_tohost;          \ 
     /* if an mtvec_handler is defined, jump to it */    \ 
     la t5, mtvec_handler;           \ 
     beqz t5, 1f;             \ 
     jr t5;               \ 
     /* was it an interrupt or an exception? */      \ 
    1: csrr t5, mcause;            \ 
     bgez t5, handle_exception;          \ 
     INTERRUPT_HANDLER;           \ 
+0

'1:'はラベルです。 –

+0

私はasmコードを書いてからしばらくしていますが、1:確かに私のラベルのようです。 – richb01

+1

特にローカルラベルです。ここでそれらの詳細を読むことができます:https://sourceware.org/binutils/docs-2.24/as/Symbol-Names.html#Symbol-Names –

答えて

5

1:は、ローカルのシンボル名です。それは単なるラベルです。 gas manualから:ローカルシンボル名

ローカルシンボルのコンパイラとプログラマが一時的に名前を使用するのに役立ちます。 これらは、入力ソースコードの スコープ全体にわたって一意であることが保証されており、簡単な表記 で参照できるシンボルを作成します。ローカルシンボルを定義するには、 N :(Nは任意の正の整数)の形式のラベルを記述します。あなたのラベルを定義した時と同じ 番号を使用して、そのシンボルの最新の定義である を参照するにはNbを書きます。ローカルラベルの次の定義 を参照するには、Nf - bは "後方"を表し、f は "前方"を表します。

これらのラベルの使用方法に制限はなく、 も同様に再利用できます。したがって、 ローカルラベル(同じ番号Nを使用)を繰り返し定義することは可能ですが、 という番号の最後に定義されたローカルラベル(後方の 参照)または特定の フォワードリファレンスのローカルラベル。最初の10個のローカルの ラベル(0:... 9 :)が他のものよりもやや効率的なやり方で実装されていることにも注意してください。 ここで

は一例です:

のと同じです
1:  jra 1f 
2:  jra 1b 
1:  jra 2f 
2:  jra 1b 

label_1: jra label_3 
label_2: jra label_1 
label_3: jra label_4 
label_4: jra label_3 

ローカルシンボル名のみ表記デバイスです。 アセンブラで使用される前に、それらは即座により一般的なシンボル名 に変換されます。あなたの例で...

ラベルは、いくつかの指示を参照した従来されていること:

beqz t5, 1f; 

そこ1fは、「次のラベルが1という名前」を意味し、ちょうどその1:にジャンプします。

ローカルラベルを定義して参照するのに便利な方法です。どこでもユニークな名前を考える必要はありません。

はここanother exampleです:

あり
#define TEST_JR_SRC1_BYPASS(testnum, nop_cycles, inst) \ 
test_ ## testnum: \ 
    li TESTNUM, testnum; \ 
    li x4, 0; \ 
1: la x6, 2f; \ 
    TEST_INSERT_NOPS_ ## nop_cycles \ 
    inst x6; \ 
    bne x0, TESTNUM, fail; \ 
2: addi x4, x4, 1; \ 
    li x5, 2; \ 
    bne x4, x5, 1b \ 

我々はラベルが2f1bなどとして参照されている参照します

関連する問題