63 lines
2 KiB
ArmAsm
63 lines
2 KiB
ArmAsm
.global btohex
|
|
.global tohex
|
|
|
|
.section .rodata
|
|
|
|
hexchars:
|
|
.ascii "0123456789ABCDEF"
|
|
|
|
.text
|
|
|
|
# Write hex representation of word into buffer
|
|
# arguments:
|
|
# a0: value to format
|
|
# a1: address of buffer to write to
|
|
# temporaries used:
|
|
# t0
|
|
# return:
|
|
# none
|
|
tohex:
|
|
addi sp, sp, -20 # allocate stack space
|
|
sw s0, 16(sp) # save contents of s0
|
|
sw s1, 12(sp) # save contents of s1
|
|
li s0, 0 # set up loop variables
|
|
li s1, 4
|
|
addi a1, a1, 6 # offset output address to end chars
|
|
tohex_loop:
|
|
sw ra, 8(sp) # save contents of ra
|
|
sw a0, 4(sp) # save contents of ra
|
|
sw a1, 0(sp) # save contents of ra
|
|
jal btohex
|
|
lw a1, 0(sp) # restore contents of a1
|
|
sh a0, 0(a1) # write the two bytes to the output buffer
|
|
lw a0, 4(sp) # restore contents of a0
|
|
lw ra, 8(sp) # restore contents of ra
|
|
srli a0, a0, 8 # shift the next byte to format down
|
|
addi a1, a1, -2 # decrement output buffer address
|
|
addi s0, s0, 1 # increment loop counter
|
|
blt s0, s1, tohex_loop # TODO: we don't need the loop counter and output addr
|
|
lw s0, 16(sp) # restore s0 & s1
|
|
lw s1, 12(sp)
|
|
addi sp, sp, 20 # deallocate stack space
|
|
ret
|
|
|
|
# Convert byte to ASCII hex
|
|
# arguments:
|
|
# a0: value to format
|
|
# temporaries used:
|
|
# t0, t1
|
|
# return:
|
|
# a0: value in ASCII hex
|
|
btohex:
|
|
la a1, hexchars # load address of hexchars
|
|
andi t0, a0, 0xF # Mask off lower nybble
|
|
add a2, a1, t0 # a2 = offset to nybble hex char
|
|
lbu t0, 0(a2) # load hex char for lower nybble into t0
|
|
srli t1, a0, 4 # shift upper nybble down
|
|
andi t1, t1, 0xF # mask off upper nybble
|
|
add a2, a1, t1 # offset to nybble
|
|
lbu a0, 0(a2) # load hex char for upper nybble into a0
|
|
slli t0, t0, 8 # shift lower char up (little endian)
|
|
or a0, a0, t0 # OR the lower char into a0
|
|
ret
|
|
|