str2hex.s
调用前声明:extern void str2hex(char str, uint8_t *num);
AREA My_Function, CODE, READONLY ; 定义代码段
THUMB ; 使用Thumb指令集
EXPORT str2hex ; 导出函数名
str2hex
PUSH {R4-R7, LR} ; 保存寄存器
MOV R2, R0 ; R2保存输入字符
MOV R3, R1 ; R3指向输出数值
; 处理输入字符
BL char2hex
STRB R0, [R3] ; 存储转换后的数值
POP {R4-R7, PC} ; 恢复寄存器并返回
char2hex
PUSH {R1-R3, LR} ; 保存寄存器
CMP R2, #'0' ; 比较是否小于'0'
BLT invalid
CMP R2, #'9' ; 比较是否大于'9'
BGT check_upper
SUB R0, R2, #'0' ; 转换为0-9
POP {R1-R3, PC} ; 恢复寄存器并返回
check_upper
CMP R2, #'A' ; 比较是否小于'A'
BLT invalid
CMP R2, #'F' ; 比较是否大于'F'
BGT check_lower
SUB R0, R2, #'A' - 10 ; 转换为10-15
POP {R1-R3, PC} ; 恢复寄存器并返回
check_lower
CMP R2, #'a' ; 比较是否小于'a'
BLT invalid
CMP R2, #'f' ; 比较是否大于'f'
BGT invalid
SUB R0, R2, #'a' - 10 ; 转换为10-15
POP {R1-R3, PC} ; 恢复寄存器并返回
invalid
MOV R0, #0xFF ; 返回无效值
POP {R1-R3, PC} ; 恢复寄存器并返回
END ; 结束代码段
hex2str.s
调用前声明:extern void hex2str(uint8_t num,char *str);
AREA My_Function, CODE, READONLY ; 定义代码段
THUMB ; 使用Thumb指令集
EXPORT hex2str ; 导出函数名
hex2str
PUSH {R4-R7, LR} ; 保存寄存器
MOV R2, R0 ; 将输入的8位数值复制到R2
MOV R3, #2 ; 循环计数器,2个字符(8位数值)
MOV R4, #'0' ; '0'的ASCII值
convert_loop
AND R6, R2, #0xF ; 取最低4位
CMP R6, #9 ; 判断是否大于9
ITE LE
ADDLE R6, R6, R4 ; 加上'0'的偏移量
ADDGT R6, R6, #0x57 ; 加上'a' - 10的偏移量(0x57)
ROR R2, R2, #4 ; 将R2右移4位,处理下一个4位
STRB R6, [R1], #1 ; 将字符存储到R1指向的内存地址,并递增R1
SUBS R3, R3, #1 ; 递减循环计数器
BNE convert_loop ; 如果计数器不为0,继续循环
MOV R0, #0 ; 添加字符串终止符'\0'
STRB R0, [R1] ; 存储到R1指向的内存地址
POP {R4-R7, PC} ; 恢复寄存器并返回
END ; 结束代码段
————————————————
版权声明:本文为CSDN博主「砂糖桔Kyin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44213002/article/details/156155403
|