Подтвердить что ты не робот

Разница между "секцией" и "сегментом" в NASM

Я использую некоторые детские программы NASM, чтобы помочь мне выучить язык.

Из того, что я прочитал, программы NASM могут иметь три раздела;.data,.bss и .text, который является обязательным. Однако я часто нахожу, что иногда имена разделов section, а иногда - segment.

Например, с этим "Hello World", который я нашел в Интернете:

;  hello.asm  a first program for nasm for Linux, Intel, gcc
;
; assemble: nasm -f elf -l hello.lst  hello.asm
; link:     gcc -o hello  hello.o
; run:          hello 
; output is:    Hello World 

    SECTION .data       ; data section
msg:    db "Hello World",10 ; the string to print, 10=cr
len:    equ $-msg       ; "$" means "here"
                ; len is a value, not an address

    SECTION .text       ; code section
        global main     ; make label available to linker 
main:               ; standard  gcc  entry point

    mov edx,len     ; arg3, length of string to print
    mov ecx,msg     ; arg2, pointer to string
    mov ebx,1       ; arg1, where to write, screen
    mov eax,4       ; write sysout command to int 80 hex
    int 0x80        ; interrupt 80 hex, call kernel

    mov ebx,0       ; exit code, 0=normal
    mov eax,1       ; exit command to kernel
    int 0x80        ; interrupt 80 hex, call kernel

Если я изменил каждый экземпляр section на segment, он все равно будет работать.

Может кто-нибудь объяснить разницу между ними, если таковые имеются?

4b9b3361

Ответ 1

Из документации nasm:

Директива SECTION (СЕГМЕНТ - это точно эквивалентный синоним)

Nasm может производить вывод в различных форматах, некоторые из которых поддерживают разделы. Определенные имена разделов могут быть произвольными (например, три перечисленные вами), для них учитываются только флаги разделов. Предопределенные - это просто удобные сочетания, .text помечен как содержащий код, .data как инициализированные данные чтения и записи и .bss как ноль-инициализированные данные для чтения-записи. Вы можете поместить свой код в раздел с именем foo, если он был помечен как раздел кода, и вы можете использовать несколько разделов по своему усмотрению.

Ответ 2

Также стоит отметить, что вы можете определять свои собственные разделы с помощью специальных флагов (и изменять флаги в разделах по умолчанию), что является расширением elf к директиве section. Из документов:

Как и формат obj, elf позволяет вам указать дополнительную информацию в строке директивы SECTION, чтобы управлять типом и свойствами объявляемых вами разделов.

Например, вы можете создать раздел следующим образом:

section .special write

После сборки вы можете проверить его: readelf -S test.o

[3] .special          PROGBITS         0000000000000000  00000250
   0000000000000005  0000000000000000  WA       0     0     1