基于Big Endian 7 ARM架构,如何提取数字序列中的单个数字?
ARMv7大端模式下提取UPC码指定数字的方法
首先明确核心前提:
- DCB定义的UPC字符串是ASCII字符序列,每个字符占1字节,比如'0'对应ASCII值
0x30,'3'对应0x33,以此类推。 - 大端模式下,字符串的存储顺序与字符顺序完全一致:起始地址存放第一个字符'0',偏移+1是第二个字符'1',偏移+2就是你要的第三个字符'3'。
具体实现步骤
计算目标字符的内存偏移:
字符串索引从0开始计数,第3位数字对应索引2,所以内存偏移量为2字节。用LDRB加载目标字符的ASCII值:
假设UPC字符串的起始地址存在r0寄存器中,执行指令:LDRB r1, [r0, #2] @ 把第3位字符的ASCII值加载到r1寄存器将ASCII值转换为实际数字:
减去ASCII表中'0'的数值0x30,得到对应的十进制数字:SUB r1, r1, #0x30 @ 此时r1中存储的就是第3位数字3
常见问题排查
你之前用LDRB未成功,大概率是这两个原因:
- 偏移量计算错误:误将第3位对应偏移3,实际应为从0开始计数的偏移2。
- 未做ASCII到数字的转换:直接使用加载的ASCII值参与计算,而非减去
0x30后的实际数字。
完整代码片段示例
.data upc_code: DCB "013800150738", 0 @ 末尾添加0作为字符串结束符 .text .global main main: LDR r0, =upc_code @ 将UPC字符串的起始地址加载到r0 LDRB r1, [r0, #2] @ 提取第3位字符的ASCII值 SUB r1, r1, #0x30 @ 转换为十进制数字 @ 此时r1中存储的就是目标数字,可直接用于后续计算 BX lr
内容的提问来源于stack exchange,提问作者moksh trehan
相关产品推荐
相关产品推荐

