0

アセンブリ サブルーチンの非常に正確な仕様があります。

仕様

名前: サブルーチンは、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 
4

3 に答える 3

3

これは宿題なので、コードを書くのはあなた自身の仕事ですが、おそらくこれはあなたを助けることができます:

任意のサイズのレジスタがあり、そこから特定のビットのみが必要な場合は、マスクとの AND 演算を検討してください。たとえば、最下位 7 ビットの場合

11111101 AND 01111111 => 01111101

I don't know how to return valuesに関して、答えはあなたの課題に書かれています:

戻り値: 1 つだけ、レジスタ r2 に返されます

ルーチンが終了する前に、返したいものをレジスタ r2 に格納するだけです。

于 2012-08-20T14:58:13.877 に答える
1

これらの点のいくつかについて、この割り当て/アセンブリと他の構造化プログラミングの用語を考えすぎているかもしれません。アセンブリ(一般的に)では、サブルーチンはまさにそれです-独立して実行できるコードのスニペット。たとえば、アセンブリ全体で一貫して再利用したサブルーチンの1つは、フラッシュに書き込まれた文字列を取得してシリアル接続を介して送信するサブルーチンでした(多かれ少なかれ、一定の文字列cout...すぐに使用できます)足りる)。私は個人的に.macroディレクティブを使用してこれらのサブルーチンを作成し、コードをより「手続き型」に感じられるようにしました。

戻り値は、問題が示唆するとおりです。

戻り値:1つだけで、レジスタr2に返されます。レジスタr2の最下位7ビットは、以下に説明するようにASCIIコードである必要があります。

これは、プログラムの適切な出力が何であれ、それがレジスタr2にある必要があることを意味します。

まず、実際のコーディングの観点から、このドキュメントに精通することから始めます。http: //www.altera.com/literature/hb/nios2/n2cpu_nii51017.pdf

最後に、私がこのクラスを受講したとき、私たちはAtmel AVRプロセッサーを使用しました。この本は、私が今まで見た中で最も完全で読みやすいアセンブリプログラミングの初心者向けの本の1つです。 、私は幸運にも本を書いた教授と一緒にクラスに参加できました...そしてそれはAVR命令セットの外ではそれほど役に立たないかもしれませんが、それは低レベルシステムの非常に詳細で実用的な見方を与えますプログラミング。

http://www.amazon.com/Some-Assembly-Required-Microcontroller-ebook/dp/B007IVDXVM/ref=cm_cr_pr_product_top

于 2012-08-20T14:52:59.023 に答える
1

通常、これは上位 28 ビットの AND を取り、残りを使用して '0123456789ABCDEF' ASCII ルックアップ テーブルのインデックスを作成することによって行われます。ARM の 3 つの命令のようなものです。

幸運を!

于 2012-08-22T09:00:00.280 に答える