gpt4 book ai didi

assembly - 如何从 4 位十六进制转换为 7 位 ASCII?

转载 作者:行者123 更新时间:2023-12-04 02:05:08 25 4
gpt4 key购买 nike

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

实际的作业文本是这样的:

HA 3.1. Draw a flow-chart for a subroutine to convert a 4-bit hexadecimal value to the corresponding 7-bit ASCII-code. See the full specification for hexasc below. Example: binary 0010 (hexadecimal digit 2) is converted to 011 0010 (ASCII-code for '2'). Another example: binary 1011 (hexadecimal digit B) is converted to 100 0010 (ASCII-code for 'B') Make sure that your subroutine is documented according to our requirements.

HA 3.2. Using the labwork project in the Nios II IDE, create a new file called hexasc.s

HA 3.3. In the file hexasc.s, write a subroutine called hexasc, that converts a 4-bit hexadecimal value to the corresponding 7-bit ASCII-code.



我为程序画了一个流程图:
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

最佳答案

当您屏蔽低四位时,您可能会以 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) 怎么办?如何更改算法?

关于assembly - 如何从 4 位十六进制转换为 7 位 ASCII?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12054127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com