アセンブリ サブルーチンの非常に正確な仕様があります。
仕様
名前: サブルーチンは、hexsc と呼ばれる必要があります。入力パラメータ: レジスタ r4 に 1 つだけ。レジスタ r4 の最下位 4 ビットは、0 から 15 までの数値を指定します。入力の他のすべてのビットの値は無視する必要があります。戻り値: 1 つだけ、レジスタ r2 に返されます。レジスタ r2 の最下位 7 ビットは、以下で説明するように ASCII コードでなければなりません。出力の他のすべてのビットはゼロでなければなりません。必要な処置: 入力値 0 から 9 は、それぞれ数字 '0' から '9' の ASCII コードに変換する必要があります。入力値 10 ~ 15 は、それぞれ文字「A」~「F」の ASCII コードに変換する必要があります。副作用: レジスタ r2 から r15 の値が変更される場合があります。サブルーチンが戻るとき、他のすべてのレジスターの値は変更されていない必要があります。
サブルーチンの作り方は知っているかもしれませんが、それまでやったことがありません。レジスタから最下位 4 ビットを指定する方法がわかりません。値を返す方法がわかりません。私はアセンブリ プログラミングを始めたばかりで、プログラムを実行することはできますが、実際にはプログラムを作成することはできません。役立つヒントを教えていただけますか?プロセッサーのマニュアルはこちらから入手できます。
私が提案できる最善の方法は、インターネットからこのコードの一部を借りたので、私が理解できないすべてです.
.global main
.text
.align 2
main: movi r8, 0x09
movi r9, 0x0f
andi r4, r4, 0x0f
bgt r8, r4, L1
movi r2, 0x1e
add r2, r2, r4
andi r2, r2, 0xff
movia r2,putchar
br L2
L1: movi r2, 0x29
add r2, r2, r4
andi r2, r2, 0xff
movia r2,putchar
L2: .end
コードにコメントしましたが、サブルーチンではなく、変換アルゴリズムが正しく実装されているかどうかわからないため、仕様に従っていないと思います。
.global hexasc
.text
.align 2
hexasc: movi r8, 0x09 #we are going to use the decimal number 9
movi r9, 0x0f #we also will use decimal number 15
andi r4, r4, 0x0f #keep only last 4 bits of what is in r4
bgt r8, r4, L1 #go to L1 if 9 > x
movi r2, 0x1e #use decimal number 30
add r2, r2, r4 #add 30 and what is in r4
andi r2, r2, 0xff
movia r2,putchar
br L2
L1: movi r2, 0x29 #this is reached iff 9 > x
add r2, r2, r4
andi r2, r2, 0xff
movia r2,putchar
L2: .end