assembly 在MIPS程序集中将数字转换为十六进制ASCII字符

ih99xse1  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(139)

我目前正在写一个汇编语言子程序“hexasc”,它将0到15范围内的数字转换成可打印的ASCII编码字符(“0”到“9”,或“A”到“F”,取决于数字)。
我曾尝试使用基本的汇编语言指令(如“li”和“move”)编写子例程,但我在获得所需的输出时遇到了麻烦。以下是我迄今为止编写的代码:
hexasc: li $v0, 48 add $v0, $a0 jr $ra
我将非常感谢任何关于如何正确实现这个子例程的帮助或指导。我特别难以在不使用任何寄存器(如s 0-s7、gp、sp、fp和ra)的情况下将输入数字转换为相应的ASCII字符。
这是我现在所拥有的
'#十六进制. asm

.text

main:li $a0,0 #更改此选项以测试不同的值

jal hexasc      # call hexasc
nop         # delay slot filler (just in case)  

move    $a0,$v0     # copy return value to argument register

li  $v0,11      # syscall with v0 = 11 will print out
syscall         # one byte from a0 to the Run I/O window

stop:j stop #一次运行后停止nop #延迟时隙填充器(以防万一)
hexasc:#您可以在此处编写自己的hexasc代码'

bakd9h0s

bakd9h0s1#

让我们想一想。

Number    Ascii (hex)
0            30
1            31
2            32
3            33
4            34
5            35
6            36
7            37
8            38
9            39
A            41
B            42
C            43
D            44
E            45
F            46

所以我们看到一个简单的模式:如果我们的4位数大于0x39,则将0x37加到该数字上,否则,将0x30加到该数字上(您可能需要执行andi $a0,$a0,0x0F,以截断最低4位以外的所有内容)。
编辑:我没有很好地解释为什么我们在大于9的数字上加0x37。

0x0A + 0x37 = 0x41 (ascii code of 'A')
0x0B + 0x37 = 0x42 (ascii code of 'B')
etc.

相关问题