我在debian linux下用汇编语言写了一个简单的“Hello world”:
; Define variables in the data section
SECTION .data
hello: db 'Hello world!',10
helloLen: equ $-hello
; Code goes in the text section
SECTION .text
GLOBAL _start
_start:
mov eax,4 ; 'write' system call = 4
mov ebx,1 ; file descriptor 1 = STDOUT
mov ecx,hello ; string to write
mov edx,helloLen ; length of string to write
int 80h ; call the kernel
; Terminate program
mov eax,1 ; 'exit' system call
mov ebx,0 ; exit with error code 0
int 80h ; call the kernel
组装后
nasm -f elf64 hello.asm -o hello.o
ld -o hello hello.o.
我得到了一个9048字节的二进制文件。
然后我修改了代码中的两行:从.data
到.DATA
和从.text
到.TEXT
:
SECTION .DATA
SECTION .TEXT
得到了一个4856字节二进制数
将它们更改为
SECTION .dAtA
SECTION .TeXt
也产生了一个4856字节的二进制文件。
NASM被声明为不区分大小写的编译器。那么有什么区别呢?
1条答案
按热度按时间v64noz0r1#
您可以自由地为ELF节使用任何您喜欢的名称,但是如果您不使用标准名称,则指定节标志将成为您的责任。(如果您使用标准名称,则可以利用这些名称的默认标志设置。)部分名称区分大小写,NASM可以识别
.data
和.text
。.DATA
、.dAta
等则不能识别,并且没有任何东西将这些部分彼此区分开,从而允许ld
将它们合并成单个片段。这会自动使可执行文件变小。使用
.text
和.data
的标准标志,其中一个是只读的,另一个是读写的,这意味着它们不能放在同一个内存页中。在示例程序中,这两个部分都很小,因此它们可以放在一个内存页中。因此,使用非标准名称会使可执行文件变小一页。但是其中一个部分将具有不正确的可写性。