# .bss

A la programació d'ordinadors, el símbol d'inici de bloc (abreujat a .bss o bss) és la part d'un fitxer objecte, executable o codi de llenguatge ensamblador que conté variables assignades estàticament que es declaren però encara no se'ls ha assignat un valor. Sovint es coneix com a "secció bss" o "segment bss".
Normalment només la longitud de la secció bss, però cap dada, s'emmagatzema al fitxer objecte. El carregador de programes assigna memòria per a la secció bss quan carrega el programa. Si col·loqueu variables sense valor a la secció .bss, en comptes de la secció .data o secció rodata que requereixen dades de valor inicial, es redueix la mida del fitxer objecte.
En algunes plataformes, part o tota la secció bss s'inicialitza a zeros. Els sistemes semblants a Unix i Windows inicialitzen la secció bss a zero, permetent que les variables C i C++ assignades estàticament inicialitzades a valors representats amb tots els bits zero es posin al segment bss. Els sistemes operatius poden utilitzar una tècnica anomenada zero-fill-on-demand per implementar de manera eficient el segment bss. Al programari incrustat, el segment bss s'assigna a la memòria que el sistema de temps d'execució C inicialitza a zero abans que s'introdueixi main. Alguns sistemes C en temps d'execució poden permetre que part del segment bss no s'inicialitzi; Les variables C s'han de col·locar explícitament en aquesta part del segment bss.
En algunes arquitectures d'ordinadors, la interfície binària de l'aplicació també admet un segment sbss per a "dades petites". Normalment, es pot accedir a aquests elements de dades mitjançant instruccions més breus que només poden accedir a un determinat rang d'adreces. Les arquitectures que admeten l'emmagatzematge local del fil poden utilitzar una secció tbss per a dades estàtiques no inicialitzades marcades com a fil local.

## Origen

Històricament, BSS (de Block Started by Symbol) és una pseudooperació a UA-SAP (United Aircraft Symbolic Assembly Program), l'assemblador desenvolupat a mitjans dels anys 50 per a l'IBM 704 per Roy Nutt, Walter Ramshaw i altres a United. Corporació Aeronautica. La paraula clau BSS es va incorporar més tard al programa d'assemblatge FORTRAN (FAP) i al programa d'assemblatge macro (MAP), els assembladors estàndard d'IBM per als seus ordinadors 709 i 7090/94. Va definir una etiqueta (és a dir, símbol) i va reservar un bloc d'espai no inicialitzat per a un nombre determinat de paraules. En aquesta situació, BSS va servir com a abreviatura en lloc de reservar individualment diverses ubicacions de dades més petites per separat. Alguns assembladors admeten una directiva complementària o alternativa BES, per a Block Ended by Symbol, on el símbol especificat correspon al final del bloc reservat.

## BSS en C

A C, els objectes assignats estàticament sense un inicialitzador explícit s'inicien a zero (per als tipus aritmètics) o un punter nul (per als tipus de punter). Les implementacions de C solen representar valors zero i valors de punter nul amb un patró de bits que consisteix únicament en bits de valor zero (malgrat que l'estàndard C no requereix omplir bss amb zero, totes les variables en .bss s'han d'inicialitzar individualment en algun tipus). de zeros segons la secció 6.7.8 de la norma C ISO 9899:1999 o la secció 6.7.9 per a estàndards més nous). Per tant, el segment BSS normalment inclou tots els objectes no inicialitzats (tant variables com constants) declarats a l'àmbit del fitxer (és a dir, fora de qualsevol funció) així com variables locals estàtiques no inicialitzades (variables locals declarades amb la paraula clau static); Les constants locals estàtiques s'han d'inicialitzar en la declaració, però, ja que no tenen una declaració separada i, per tant, normalment no es troben a la secció BSS, encara que es poden inicialitzar implícitament o explícitament a zero. Una implementació també pot assignar variables i constants assignades estàticament inicialitzades amb un valor que consisteix únicament en bits de valor zero a la secció BSS.

## Referències

* ↑ McKusick, Marshall Kirk. «A New Virtual Memory Implementation for Berkeley UNIX» (en anglès). University of California, Berkeley.
* ↑ «Memory Sections» (en anglès). AVR Libc Home page.
* ↑ «ELF Special Sections» (en anglès). Linux Standard Base PDA Specification 3.0RC1.
* ↑ FORTRAN ASSEMBLY PROGRAM (FAP) for the IBM 709/7090. IBM, 1961, p. 30. J28-6098-1.
* ↑ IBM 7090/7094 IBSYS Operating System Version 13 Macro Assembly Program (MAP) Language. IBM, 1963. C28-6392-4.
* ↑ Timar, Ted. «Unix - Frequently Asked Questions (1/7)».
* ↑ Free Software Foundation, Inc.. «38.9. Directives». Using as: Using as, the Gnu Assembler. Arxivat de l'original el 19 març 2014. [Consulta: 22 febrer 2014].
* ↑ Jason W. Bacon. «Chapter 10. Subprogram Calls and the Stack» (en anglès). cs.uwm.edu, 13-03-2012. Arxivat de l'original el 2014-05-02. [Consulta: 2 maig 2014].
* ↑ «Memory Segment - Data Segment (DS) - (ES, FS, GS)» (en anglès), 06-01-2019. [Consulta: 18 setembre 2023].
* ↑ «6: MIPS Memory - the Data Segment» (en anglès), 26-06-2020. [Consulta: 18 setembre 2023].
* ↑ TylerMSFT. «data_seg pragma» (en anglès americà), 03-08-2021. [Consulta: 18 setembre 2023].
* ↑ Kumar, Krishan. «Memory Layout of C Program. Code Data BSS Stack Heap Segments» (en anglès). [Consulta: 18 setembre 2023].