[技术手册] 为未初始化数据分配空间

[复制链接]
 楼主| AdaMaYun 发表于 2025-5-26 13:00 | 显示全部楼层 |阅读模式

在程序中,有时我们需要为一些数据保留一些存储空间,但不需要为它们初始化,而是在后续程序运行过程中被赋予实际值。

这个时候,我们就需要用到汇编语言中的保留指令,这些指令用于在内存中分配指定大小的空间,但不对其中的数据进行初始化。

常见的保留指令有:

指令        用途
RESB        保留一个 Byte(一个字节)
RESW        保留一个 Word(两个字节)
RESD        保留一个 Doubleword(四个字节)
RESQ        保留一个 Quadword(八个字节)
REST        保留十个字节空间(十个字节)
多重定义
一个程序可以定义多个数据定义的语句,例如:

choice DB 'y'
number DW 123
bigbumber DQ 123456789
这样定义的语句,编辑器会为这些变量分配连续的内存。

多次初始化
times 指令允许对同一值进行多次初始化,这样在定义数组和表示非常有用。可以使用如下语句,创建名为 stars、数据元素类型为DW 的数组,包含 9 个元素,每个初始化为 0.

stars TIMES 9 DW 0        ;
我们重温一下上面输出 9 个 * 的汇编程序:

section .text
        global _start

section .data
        stars times 9 db '*'

_start:
        mov edx, 9
        mov ecx, stars
        mov ebx, 1
        mov eax, 4
        int 0x80

        mov eax, 1
        int 0x80
同样编译运行后,会输出:

*********
磨砂 发表于 2025-7-5 09:54 | 显示全部楼层
在程序的全局变量区或静态存储区声明变量,编译器会自动为其分配空间,且未初始化的全局变量和静态变量在程序开始执行前会被自动清零
晓伍 发表于 2025-7-5 12:18 | 显示全部楼层
使用静态变量或全局变量声明分配的空间是固定的,在编译时就需要确定
八层楼 发表于 2025-7-5 14:52 | 显示全部楼层
静态或者全局变量的这种方式简单直接,生命周期贯穿整个程序运行期间,在程序开始运行时就分配好了空间,不需要在程序运行时动态申请和释放
观海 发表于 2025-7-5 17:36 | 显示全部楼层
#include <stdio.h>

// 声明一个长度为10的全局整型数组,未初始化
int global_array[10];

// 声明一个静态的字符数组,未初始化
static char static_array[20];

int main() {
    // 可以在程序中使用这些数组
    for (int i = 0; i < 10; i++) {
        printf("global_array[%d] = %d
", i, global_array[i]);
    }
    for (int i = 0; i < 20; i++) {
        printf("static_array[%d] = %c
", i, static_array[i]);
    }
    return 0;
}


guanjiaer 发表于 2025-7-5 20:13 | 显示全部楼层
动态分配可以在需要时分配,使用完后再释放,提高了内存的利用率
heimaojingzhang 发表于 2025-7-6 08:04 | 显示全部楼层
并非所有的单片机都支持完整的动态内存分配功能,而且在使用动态内存分配时要注意防止内存泄漏等问题
keaibukelian 发表于 2025-7-6 10:38 | 显示全部楼层
对于一些特定的单片机,可以通过直接操作内存映射寄存器或特定的内存地址来分配空间
paotangsan 发表于 2025-7-6 12:52 | 显示全部楼层
直接操作内存地址需要对单片机的内存架构有深入的了解,知道哪些地址范围是可用于数据存储的,并且要确保不会与其他重要的内存区域发生冲突
renzheshengui 发表于 2025-7-6 15:36 | 显示全部楼层
#include <stdio.h>

#define MEMORY_START_ADDRESS 0x2000 // 假设从这个地址开始分配空间

int main() {
    // 将一段内存视为一个未初始化的数组使用
    int *custom_array = (int *)MEMORY_START_ADDRESS;

    // 假设我们要使用10个整型空间
    for (int i = 0; i < 10; i++) {
        printf("custom_array[%d] = %d
", i, custom_array[i]);
    }

    return 0;
}


wowu 发表于 2025-7-6 17:58 | 显示全部楼层
直接地控制内存的分配,风险较高,容易破坏其他数据或程序的正常运行
您需要登录后才可以回帖 登录 | 注册

本版积分规则

299

主题

2492

帖子

6

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