2015-04-28 7 views
0

У меня есть этот код, который я скомпилировал для платформы MSP430, используя msp430-gcc.Почему мои данные и память сегмента памяти bss равны нулю?

#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 сегмент, который говорит мне о моем использовании оперативной памяти равен нулю. Я предполагаю, что мой сегмент bss равен нулю, так как у меня нет никаких неинициализированных переменных.

Я был бы очень благодарен, если кто-нибудь сможет объяснить мне, что здесь происходит. Спасибо.

+2

Вы можете посмотреть список сборок и посмотреть, куда идут ваши литералы. Они могут быть включены в качестве непосредственной инструкции, которая помещает их в ваш раздел «текст». – Alden

+0

Также весь объектный файл будет загружен в ОЗУ, поэтому я не уверен, почему вас беспокоит раздел 'data', равный нулю. В этом разделе действительно нет ничего, но ваш код займет место (278 байт). – Alden

+0

Олден, я хотел бы знать, сколько ROM и RAM-памяти потребляется этой программой. Моя цель - уменьшить их насколько я могу. Поскольку раздел 'data' +' bss' рассказывает мне об использовании ОЗУ, я хочу знать эти значения. – NanoNi

ответ

0

Что вы объявляете, являются локальными переменными. Они будут сохранены в стеке. В общем случае размер ОЗУ, занимаемый стеком, не может быть определен во время компиляции. Однако для простых приложений, таких как ваш, можно оценить верхнюю границу использования стека, либо используя objdump, либо подсчитывая байты вручную, либо используя некоторые из существующих инструментов для статического анализа.

Для того, чтобы хранить переменные в .data и .bss сегментов, используйте static типа спецификатор:

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

Это является лучшей практикой; динамическое распределение, такое как выделение в стеке, не является тем, что вы хотите делать в приложениях микроконтроллера.

0

data раздел содержит инициализированные данные, то есть, глобальные или статические переменные с ненулевым значением:

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

bss секция содержит неинициализированные данные, то есть, глобальные или статические переменные по умолчанию (ноль) Значение:

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

Ваша программа не содержит таких переменных, поэтому эти разделы пустые.

Все ваши переменные: автоматический, т. Е. На стеке. Стек распределяется динамически, и нет простого способа определить максимальный размер стека, просто глядя на объектный файл.