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)
当屏蔽掉低四位时,最终可能会出现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)?如何更改算法?