6.2. 你好,世界!

6.2.1. 程序布局

Linux 是 32 位系统,运行在保护模式,具有扁平内存模型,并使用 ELF 格式作为二进制文件格式。

一个程序可以分为几个部分:.text用于存放你的代码(只读),.data用于存放你的数据(读写),.bss用于存放未初始化的数据(读写);实际上可能还有其他一些标准部分,以及一些用户自定义部分,但是很少需要使用它们,而且它们也不在我们讨论的范围之内。一个程序至少要有一个.text部分。

现在我们将编写我们的第一个程序。这是示例代码:

6.2.2. NASM (hello.asm)

section .text                   ;section declaration

                                ;we must export the entry point to the ELF linker or
    global  _start              ;loader. They conventionally recognize _start as their
			                          ;entry point. Use ld -e foo to override the default.

_start:

                                ;write our string to stdout

    mov     edx,len             ;third argument: message length
    mov     ecx,msg             ;second argument: pointer to message to write
    mov     ebx,1               ;first argument: file handle (stdout)
    mov     eax,4               ;system call number (sys_write)
    int     0x80                ;call kernel

                                ;and exit

  	mov     ebx,0               ;first syscall argument: exit code
    mov     eax,1               ;system call number (sys_exit)
    int     0x80                ;call kernel

section .data                   ;section declaration

msg db      "Hello, world!",0xa ;our dear string
len equ     $ - msg             ;length of our dear string

6.2.3. GAS (hello.S)

.text                           # section declaration

			                          # we must export the entry point to the ELF linker or
    .global _start              # loader. They conventionally recognize _start as their
			                          # entry point. Use ld -e foo to override the default.

_start:

                                # write our string to stdout

	  movl    $len,%edx           # third argument: message length
	  movl    $msg,%ecx           # second argument: pointer to message to write
	  movl    $1,%ebx             # first argument: file handle (stdout)
	  movl    $4,%eax             # system call number (sys_write)
	  int     $0x80               # call kernel

                                # and exit

	  movl    $0,%ebx             # first argument: exit code
	  movl    $1,%eax             # system call number (sys_exit)
	  int     $0x80               # call kernel

.data                           # section declaration

msg:
	.ascii    "Hello, world!\n"   # our dear string
	len = . - msg                 # length of our dear string