2013-02-27 482 views
12

我正在使用一些NASM程序来帮助我学习语言。NASM中“section”和“segment”的区别

从我读过的内容来看,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它仍然会正常工作。

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

回答

22

nasm documentation

的SECTION指令(SEGMENT是完全等效的同义词)

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

+0

我做了很多谷歌搜索,没有找到任何东西...应该也看过文档,我很抱歉。感谢您的答案,并为链接。也许这个线程至少会对未来的白痴有所帮助 – CodyBugstein 2013-02-27 23:24:39