8051汇编中如何将ASCII字符串在内存字段中右对齐
8051汇编Code区字符串右对齐复制到Data区实现方案
实现逻辑
- 先遍历Code区源字符串,统计有效字符长度(遇到0x00结束符终止计数)
- 结合目标Data存储块的总长度,计算右对齐的起始写入地址:
起始地址 = 目标块首地址 + (目标块总长度 - 字符串有效长度) - 从计算得到的起始地址开始,逐字节复制字符串到Data区,直到遇到结束符为止
可直接运行的汇编代码
; 可根据实际场景修改以下常量定义 TARGET_DATA_BASE EQU 30H ; 目标Data存储块首地址 BLOCK_TOTAL_LEN EQU 16 ; 目标存储块总长度(按实际行存储区长度设置,示例为16字节) SRC_STR_CODE_ADDR EQU 1000H ; 源字符串在Code区的首地址 ORG 0000H LJMP MAIN ORG 0100H MAIN: ; 步骤1:统计字符串有效长度,存入R2 MOV DPTR, #SRC_STR_CODE_ADDR CLR A MOV R2, #0 COUNT_STEP: MOVC A, @A+DPTR JZ COUNT_FINISH ; 读到结束符0x00,停止计数 INC R2 INC DPTR SJMP COUNT_STEP COUNT_FINISH: ; 步骤2:计算右对齐写入起始地址,存入R0 MOV A, #BLOCK_TOTAL_LEN CLR C SUBB A, R2 ; 计算偏移量:块长度 - 字符串长度 ADD A, #TARGET_DATA_BASE MOV R0, A ; R0为最终写入的起始地址 ; 步骤3:逐字节复制字符串 MOV DPTR, #SRC_STR_CODE_ADDR COPY_STEP: CLR A MOVC A, @A+DPTR JZ COPY_FINISH ; 读到结束符,停止复制 MOV @R0, A ; 写入Data区 INC DPTR INC R0 SJMP COPY_STEP COPY_FINISH: SJMP $ ; 程序运行结束 ; 示例源字符串,存储在Code区 ORG 1000H SAMPLE_STR: DB "ABC", 0H
效果说明
以上代码以16字节长度的存储块为例,字符串"ABC"有效长度为3,最终写入起始地址为30H + (16-3) = 3DH,即Data区3DH存0x41('A')、3EH存0x42('B')、3FH存0x43('C'),实现存储块最右侧对齐的效果。
内容的提问来源于stack exchange,提问作者SébastienT
相关产品推荐
相关产品推荐

