5

割り当ては、4ビットの16進数と7ビットのASCIIの間で変換できるサブルーチンを作成することにより、アセンブリプログラミングを学習することです。最初はわからなかったのですが、調べてみたらフローチャートを描いてプログラムを作ることができましたが、完全に正しいわけではないので、これを解決するためのご指導をお願いします。

実際の割り当てテキストは次のとおりです。

HA3.1。4ビットの16進値を対応する7ビットのASCIIコードに変換するためのサブルーチンのフローチャートを作成します。以下のhexascの完全な仕様を参照してください。例:2進数0010(16進数2)は011 0010( '2'のASCIIコード)に変換されます。別の例:バイナリ1011(16進数のB)は100 0010('B'のASCIIコード)に変換されます。サブルーチンが要件に従って文書化されていることを確認してください。

HA3.2。Nios II IDEのラボワークプロジェクトを使用して、hexasc.sという名前の新しいファイルを作成します。

HA3.3。ファイルhexasc.sに、4ビットの16進値を対応する7ビットのASCIIコードに変換するhexascというサブルーチンを記述します。

プログラムのフローチャートを作成しました。 ここに画像の説明を入力してください

そして、私が試したプログラムはこれですが、仕様に準拠していないと思われます。

        .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 

この課題の作成と解決を手伝ってもらえますか?十分な時間があります、それは一ヶ月以内に期限がありません。

アップデート

フローチャートが正しくないことをコメントで確認した後、必要な調整を行いました。 ここに画像の説明を入力してください

また、16進数とASCIIの間で変換するこのアルゴリズムがどのように正しいかについても説明したいと思います。

更新/編集

これが完全なプログラムです。

.global hexasc 

        .text
        .align 2

hexasc: movi r8, 0x09
        movi r9, 0x0f
        andi r4, r4, 0x0f #keep only 4 bits
        bgt r4, r8, L1  #is x>9?
        movi r2, 0x30
        add r2, r2, r4  
        andi r2, r2, 0xff
        ret  

L1:     movi r2, 0x37
        add r2, r2, r4
        andi r2, r2, 0xff
        ret
4

2 に答える 2

5

下位 4 ビットをマスクすると、0x0 から 0xF の値になる可能性があります。望ましい結果の表は次のとおりです。

0x0 -> '0' = 0x30
0x1 -> '1' = 0x31
0x2 -> '2' = 0x32
0x3 -> '3' = 0x33
0x4 -> '4' = 0x34
0x5 -> '5' = 0x35
0x6 -> '6' = 0x36
0x7 -> '7' = 0x37
0x8 -> '8' = 0x38
0x9 -> '9' = 0x39
0xA -> 'A' = 0x41
0xB -> 'B' = 0x42
0xC -> 'C' = 0x43
0xD -> 'D' = 0x44
0xE -> 'E' = 0x45
0xF -> 'F' = 0x46

目的の結果の表から、0x0 から 0x9 までと 0xA から 0xF までの 2 つの線形セクションがあることがわかります。0x0 から 0x9 の場合、0x30 - 0x0 = 0x30 なので、0x30 を追加します。0xA から 0xF セクションの場合、0x41 - 0xA = 0x37 です。

それはうまくいきますか?

0x0 + 0x30 = 0x30
0x1 + 0x30 = 0x31
0x2 + 0x30 = 0x32
0x3 + 0x30 = 0x33
0x4 + 0x30 = 0x34
0x5 + 0x30 = 0x35
0x6 + 0x30 = 0x36
0x7 + 0x30 = 0x37
0x8 + 0x30 = 0x38
0x9 + 0x30 = 0x39

0xA + 0x37 = 0x41
0xB + 0x37 = 0x42
0xC + 0x37 = 0x43
0xD + 0x37 = 0x44
0xE + 0x37 = 0x45
0xF + 0x37 = 0x46

いいね。

少し異なる方法は、常に 0x30 を追加してから調整することです。

0x0 + 0x30 = 0x30
0x1 + 0x30 = 0x31
0x2 + 0x30 = 0x32
0x3 + 0x30 = 0x33
0x4 + 0x30 = 0x34
0x5 + 0x30 = 0x35
0x6 + 0x30 = 0x36
0x7 + 0x30 = 0x37
0x8 + 0x30 = 0x38
0x9 + 0x30 = 0x39
0xA + 0x30 + 7 = 0x41
0xB + 0x30 + 7 = 0x42
0xC + 0x30 + 7 = 0x43
0xD + 0x30 + 7 = 0x44
0xE + 0x30 + 7 = 0x45
0xF + 0x30 + 7 = 0x46

目的の結果テーブルを作成するとき、何かを知っているはずの左側に 0xF を追加すると、0x0 から 0xF が得られ、実行したように見えます。目的のテーブルの右側は、ASCII チャートから取得されます。あなたがそのチャートを作成して電卓を手に入れたとしたら(そうです、年配の人が使用するボタンが付いた小さなものですが、16進数を行うものですが、携帯電話にはそのためのアプリが必要です)。そこから、そのテーブルから視覚的にアルゴリズムを考え出します。

また、A から F を大文字 (a、b、c、d、e、f) ではなく小文字にしたい場合はどうすればよいでしょうか? アルゴリズムを変更するにはどうすればよいですか?

于 2012-08-21T17:12:30.903 に答える
3

フローチャートのいくつかのエラー

1.最後の 4 バイトのみをマスクして保持 -->ビット
2.決定0<x<9 --> 3.決定 --> (これも余分です!)0<=x<=9
9<x<159<x<=15

プログラム

.global hexasc 

    .text
    .align 2

hexasc: movi r8, 0x09
        andi r4, r4, 0x0f #keep only 4 bits
        movi r2, 0x37
        bgt r4, r8, L1  #is x>9?
        movi r2, 0x30
L1:     add r2, r2, r4  
        ret  
于 2014-12-28T16:28:40.407 に答える