我正在使用一些婴儿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
,它仍然有用。
有人可以解释两者之间的区别吗?
答案 0 :(得分:24)
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