为什么我的数据和bss段内存使用率为零?

时间:2015-04-28 15:06:02

标签: c size ram msp430 object-files

我有使用msp430-gcc为MSP430平台编译的代码。

#include<stdio.h>
#include<stdint.h>

// Preprocessor definitions
#define ROR(x,r) ((x>>r) | (x << (64-r)))
#define ROL(x,r) ((x << r) | (x >> (64-r)))
#define R(x,y,k) (x = ROR(x,8), x+=y, x^=k, y = ROL(y,3), y^=x)

void encrypt(uint64_t* , uint64_t*, uint64_t*);

void main(){
    uint64_t key[2] ={0x0706050403020100, 0x0f0e0d0c0b0a0908}  ;    // key
    uint64_t plain_text[2] = {0x7469206564616d20, 0x6c61766975716520};
    uint64_t cipher_text[2] = {0,0};      //initializing cipher text to 0s
    uint64_t* pt = plain_text;
    uint64_t* ct = cipher_text;   // Cipher Text
    uint64_t* k = key;    // 64 b
    encrypt(pt, ct, k);
}

 /*
 * Ecnryption Method
 */
void encrypt(uint64_t* pt, uint64_t* ct, uint64_t* k){

    uint64_t i;
    uint64_t B = k[1];
    uint64_t A = k[0];
    // Encryption rounds
    for(i=0; i<32; i++){
        R(ct[1], ct[0], A);
        R(B,A, i);        
        }
    }

我想要这个程序的内存段使用统计信息,我通过生成目标文件并使用$ size命令来实现。我得到的结果如下:

text       data     bss     dec     hex filename
    278       0       0     278     116 encrypt.o

我不明白为什么data段告诉我我的RAM使用率为零。我假设我的bss段为零,因为我没有任何未初始化的变量。

如果有人能解释我在这里发生的事情,我将非常感激。谢谢。

2 个答案:

答案 0 :(得分:0)

data部分包含初始化数据,即具有非零值的全局或静态变量:

int x = 5;
void f() {
    static int y = 42;
}

bss部分包含未初始化的数据,即具有默认(零)值的全局变量或静态变量:

int x;
void f() {
    static int y;
}

您的程序不包含此类变量,因此这些部分为空。

所有变量都是自动,即在堆栈上。 堆栈是动态分配的,只需查看目标文件就没有简单的方法来检测最大堆栈大小。

答案 1 :(得分:0)

您要声明的是局部变量。它们将存储在堆栈中。在一般情况下,堆栈占用的RAM大小无法在编译时确定。但是,对于这样的简单应用程序,可以通过使用objdump和手动计算字节,或使用一些现有工具进行静态分析来估计堆栈使用的上限。

要将变量存储在.data.bss段中,请使用static类型限定符:

void main() {
     static uint64_t key[2] ={0x0706050403020100, 0x0f0e0d0c0b0a0908}; 

这是一种更好的做法;动态分配(例如堆栈中的分配)不是您想要在微控制器应用程序中执行的操作。