2009. 5. 6. 17:15

[어셈블리어] data 세그먼트와 bss 세그먼트

segment .data
msg    db    "Hello world", 0

segmen .bss
input    resd    1

위의 어셈블리어 코드를 보면, 두가지의 세그먼트를 선언하는 것을 볼 수 있다.

data segment에는 initialized data segment(초기화 된 데이터 세그먼트)와 uninitialized data segment(초기화 되지 않은 데이터 세그먼트)가 있는데 segment .data는 전자, segment .bss는 후자를 가르킨다.

즉, segment .data 에서는 초기값이 필요한 전역변수를 선언하고, segment .bss에서는 초기화가 필요없는 전역변수를 선언한다.

segment .bss에서는 RAM에 해당 영역만큼의 공간만을 잡아준다. 하지만 segment .data에서는 RAM을 할당할 뿐만 아니라 해당데이터의 초기 값을 지니고 있을 ROM또한 할당되어야 한다.

따라서, bss영역은 초기화 과정에서 컴파일러에서 지정한 초기화 방식에 의하여 초기화되며, data부분은 ROM에 있는 초기화된 데이터를 해당 data영역으로 복사함으로서 수행하게 된다.

즉, 위의 소스를 해석하면

msg라는 변수에 "Hello world\0"