单片机问题,困惑我很久了

编写程序把 ROM 中从1000H开始20个单元内容读出,并存放在内部 RAM 从30H开始的地方。

以下是一个汇编语言的程序示例,可以实现将 ROM 中从1000H开始的20个单元内容读出,存放在内部 RAM 从30H开始的地方:

ORG 0            ; 程序从地址0开始
START:
  MOV CX, 20     ; 设定循环次数为20
  MOV SI, 1000H  ; 设定源地址为ROM 1000H开始
  MOV DI, 30H    ; 设定目标地址为RAM 30H开始
LOOP:
  MOV AL, [SI]   ; 从ROM读取一个字节
  MOV [DI], AL   ; 存放到RAM中
  INC SI         ; 源地址指针增加1
  INC DI         ; 目标地址指针增加1
  LOOP LOOP      ; 循环,直到CX为0
  JMP $          ; 程序停止,无限循环

这个程序会将ROM中从1000H开始的20个单元内容读出,存放在内部RAM从30H开始的位置。程序中用CX寄存器作为循环计数器,SI寄存器作为源地址指针,DI寄存器作为目标地址指针。每次循环从ROM中读取一个字节,存放到RAM中,并将地址指针向后移动1个字节,在循环20次后程序停止。

该回答引用GPT:

MOV R0, #30H
MOV R1, #1000H
MOV R2, #20

Loop:
MOV A, @R1
MOV @R0, A
INC R0
INC R1
DJNZ R2, Loop

如还有疑问,可留言帮助解决。

这个问题困惑很久了?我对此感到很困惑。。。

  • 这篇博客: 嵌入式--深入理解单片机(一)单片机程序是如何运行起来的以及单片机的ROM和RAM中的 非运行时的单片机程序在ROM内的分布 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 下图就是通过单片机下载工具烧录到单片机Flash里面去之后的Flash空间区域分布图:

    单片机hex文件在Flash上的数据区域分布其中:

    • Code:为程序代码部分
    • Ro-data: 表示程序定义的常量(const修饰的常量、#define 宏定义等);
    • Rw-data: 表示已初始化的全局变量
    • Zi-data: 表示未初始化的全局变量(Zi-data可以表示RAM未上电时整个区域的状态,或者上电初始化之后未被使用的区域,上表仅仅描述的是ROM区域的空间分布)

    而栈区(stack)、堆区(heap)、全局区(静态区)(static)、文字常量区和程序代码区和上面所介绍的Code、Ro-data等的关系。

    • 1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 这些值是可读写的,那么stack应该被包含在RW-data(读写数据存储区),也就是单片机的sram中。
    • 2、堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。可以理解,这些也是被包含在单片机的sram中的。
    • 3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。这些数据也是可读可写的,和stack、heap一样,被包含在RAM中。
    • 4、文字常量区:常量字符串就是放在这里的。这些数据是只读的,分配在Ro-data(只读数据存储区),则被包含在flash中。
    • 5、程序代码区:存放函数体的二进制代码,可以想象也是被包含在flash,因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中。

    下图是初始化之前的ROM和RAM中的数据分布:

    • 1、未初始化之前的RAM里面所有区域都是随机的值即:Zi-data
      在这里插入图片描述