如何将4位十六进制转换为7位ASCII?

Nik*_*ntz 5 assembly hex mips nios

该分配是通过编写可以在4位十六进制和7位ASCII之间转换的子程序来学习汇编编程.起初我不知道,但经过一些研究,我可以做出努力,绘制一个流程图并制作一个程序,但这不完全正确,所以我要求你的指导,以帮助我解决这个问题.

实际的分配文本是这样的:

HA 3.1.绘制子程序的流程图,将4位十六进制值转换为相应的7位ASCII代码.请参阅下面的hexasc的完整规范.示例:二进制0010(十六进制数字2)转换为011 0010(ASCII代码为"2").另一个例子:二进制1011(十六进制数字B)转换为100 0010("B"的ASCII代码)确保根据我们的要求记录子程序.

HA 3.2.使用Nios II IDE中的labwork项目,创建一个名为hexasc.s的新文件

HA 3.3.在文件hexasc.s中,编写一个名为hexasc的子例程,它将4位十六进制值转换为相应的7位ASCII码.

我已经为该程序绘制了一个流程图: 在此输入图像描述

我试过的程序是这个,但我怀疑它不符合规范:

        .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 
Run Code Online (Sandbox Code Playgroud)

你能帮我开发和解决这个任务吗?有足够的时间,直到一个月才到期.

更新

在评论中看到流程图不正确之后,我做了必要的调整: 在此输入图像描述

我还想讨论这种算法在十六进制和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
Run Code Online (Sandbox Code Playgroud)

old*_*mer 5

当屏蔽掉低四位时,最终可能会出现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
Run Code Online (Sandbox Code Playgroud)

从该期望结果表中,我们可以看到有两个线性部分,从0x0到0x9,从0xA到0xF。对于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
Run Code Online (Sandbox Code Playgroud)

看起来不错。

略有不同的方式是始终添加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
Run Code Online (Sandbox Code Playgroud)

创建所需的结果表时,您应该已经知道左侧的内容并用0xF表示,得到0x0到0xF,看来您确实这样做了。所需表的右侧来自ASCII图表。我认为,如果您制作了该图表并得出了一个计算器(是的,那是老年人使用的带有按钮的小东西,尽管会十六进制,但您的手机应该有一个应用程序)。从那张桌子上直观地看到该算法。

您还应该问自己,我是否要A至F为小写而不是大写(a,b,c,d,e,f)?如何更改算法?