该分配是通过编写可在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码。
我为该计划绘制了一个流程图:
我试过的程序就是这个,但我怀疑它不符合规范:
.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
你能帮助我发展和解决这项任务吗?有足够的时间,直到一个月才到期。
在评论中看到流程图不正确后,我做了必要的调整:
我还想讨论这种算法在十六进制和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
答案 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