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

时间:2012-08-21 11:45:42

标签: assembly hex mips nios

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

实际的作业文本是:

  

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

     

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

     

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

我为该计划绘制了一个流程图: enter image description here

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

        .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 

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

更新

在评论中看到流程图不正确后,我做了必要的调整: enter image description here

我还想讨论这种算法在十六进制和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

2 个答案:

答案 0 :(得分:4)

当您屏蔽低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。对于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图表。我想如果你已经制作了那个图表并拿出了一个计算器(是的,老人们使用的按钮那个小东西,虽然一个做十六进制,你的手机应该有一个应用程序)。从那里直观地从该表中得出算法。

您还应该问问自己,如果我希望A到F是小写而不是大写(a,b,c,d,e,f)怎么办?如何更改算法?

答案 1 :(得分:3)

流程图中的一些错误

1.Mask并保留最后四个字节 - &gt; <强>位
2.Decision 0<x<9 - &gt;的 0<=x<=9
3.Decision 9<x<15 - &gt; 9<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