[信息] stm32 THUMB str转hex hex转str

[复制链接]
81|16
磨砂 发表于 2026-4-7 17:15 | 显示全部楼层 |阅读模式
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

公羊子丹 发表于 2026-4-8 08:33 | 显示全部楼层
楼主 Thumb 汇编规范,调用前需校验字符范围,避免无效字符导致返回 0xFF 异常
周半梅 发表于 2026-4-8 08:34 | 显示全部楼层
汇编转换需做好栈保护,C 语言调用时匹配参数类型,防止出现传参异常的情况
帛灿灿 发表于 2026-4-8 08:35 | 显示全部楼层
hex2str 用移位效率高,修改偏移量可支持大写字母输出,提升实用性
童雨竹 发表于 2026-4-8 08:36 | 显示全部楼层
汇编转字符易遗漏结束符,楼主添加 \0 的细节,让串口打印可正常显示
万图 发表于 2026-4-8 08:37 | 显示全部楼层
我怀疑中断内调用函数有风险,建议关闭中断或完善寄存器保护,避免系统死机
Wordsworth 发表于 2026-4-8 08:38 | 显示全部楼层
测试可传入固定字符验证输出,快速判断汇编逻辑是否正常运行
Bblythe 发表于 2026-4-8 08:39 | 显示全部楼层
有没有大佬优化代码支持批量字符串转换,单次转换单个字符在工程中受限
Pulitzer 发表于 2026-4-8 08:40 | 显示全部楼层
Keil 调用汇编需添加.s 文件并配置 Thumb 指令集,否则会出现未定义编译报错
Uriah 发表于 2026-4-8 08:42 | 显示全部楼层
你检查过分支跳转逻辑吗?建议单步仿真,确保非法输入可稳定返回 0xFF
Clyde011 发表于 2026-4-8 08:43 | 显示全部楼层
纯汇编执行速度优于 C 语言,适配时序敏感场景,新手需熟悉流程后移植
classroom 发表于 2026-4-8 14:02 | 显示全部楼层
str2hex函数只转换一个字符,不是整个字符串,命名有误导。
cr315 发表于 2026-4-8 15:02 | 显示全部楼层
用BL char2hex前没把字符放R0,而是放R2,传参靠全局寄存器危险。
duo点 发表于 2026-4-8 18:03 | 显示全部楼层
两个函数最好都加上入口条件判断,避免非法输入崩溃。
flycamelaaa 发表于 2026-4-8 16:04 | 显示全部楼层
用C内联汇编代替独立汇编文件,更易维护和调试。
onlycook 发表于 2026-4-8 21:04 | 显示全部楼层
建议把str2hex改成循环调用char2hex,处理字符串数组。
powerantone 发表于 2026-4-8 22:05 | 显示全部楼层
hex2str转换大写可以用'0'+val,小写用'a'+val-10。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

221

主题

4702

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部
0