NASM中“section”和“segment”之间的区别

时间:2013-02-27 23:16:37

标签: assembly syntax 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,它仍然有用。

有人可以解释两者之间的区别吗?

2 个答案:

答案 0 :(得分:24)

来自nasm documentation

  

SECTION指令(SEGMENT完全等同于同义词)

Nasm可以生成各种格式的输出,其中一些支持部分。某些部分名称可以是任意的(例如您列出的三个部分),因为它们只有部分标志计数。预定义的快捷方式只是方便快捷方式,.text标记为包含代码,.data标记为读写初始化数据,.bss标记为零初始化读写数据。您可以将代码放在名为foo的部分中,只要它被标记为代码部分,您就可以根据需要使用多个部分。

答案 1 :(得分:2)

另外,值得注意的是,您可以使用特殊标志(并在默认部分更改标志)定义 own 部分,这些标志是section指令的 elf扩展。 From the docs

  

与obj格式一样,elf允许您在SECTION指令行上指定其他信息,以控制声明的节的类型和属性。

例如,您可以创建如下部分:

section .special write

组装后,您可以进行检查:readelf -S test.o

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