You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:45:03