基本语法
装配程序可分为三个部分 -
data部分,
bss部分,和
text部分。
data部分
data部分用于声明初始化数据或常量。 此数据在运行时不会更改。 您可以在本节中声明各种常量值,文件名或缓冲区大小等。
声明数据部分的语法是 -
section.data
bss部分
bss部分用于声明变量。 声明bss部分的语法是 -
section.bss
text部分
text部分用于保存实际代码。 本节必须以声明global _start开头,它告诉内核程序执行的开始位置。
声明文本部分的语法是 -
section.text
global _start
_start:
注释 (Comments)
汇编语言注释以分号(;)开头。 它可能包含任何可打印的字符,包括空白。 它可以单独出现在一条线上,如 -
; This program displays a message on screen
或者,在同一条线上连同指令,如 -
add eax, ebx ; adds ebx to eax
汇编语言陈述
汇编语言程序包含三种语句 -
- 可执行的指令或说明,
- 汇编程序指令或伪操作,以及
- Macros.
executable instructions或简单instructions告诉处理器该做什么。 每条指令都包含一个operation code (操作码)。 每个可执行指令生成一个机器语言指令。
assembler directives或pseudo-ops告诉汇编程序有关汇编过程的各个方面。 这些是不可执行的,不会生成机器语言指令。
Macros基本上是文本替换机制。
汇编语言语句的语法
汇编语言语句每行输入一个语句。 每个声明都遵循以下格式 -
[label] mnemonic [operands] [;comment]
方括号中的字段是可选的。 基本指令有两部分,第一部分是要执行的指令(或助记符)的名称,第二部分是操作数或命令的参数。
以下是典型汇编语言陈述的一些示例 -
INC COUNT ; Increment the memory variable COUNT
MOV TOTAL, 48 ; Transfer the value 48 in the
; memory variable TOTAL
ADD AH, BH ; Add the content of the
; BH register into the AH register
AND MASK1, 128 ; Perform AND operation on the
; variable MASK1 and 128
ADD MARKS, 10 ; Add 10 to the variable MARKS
MOV AL, 10 ; Transfer the value 10 to the AL register
大会中的Hello World计划
以下汇编语言代码在屏幕上显示字符串'Hello World' -
section .text
global _start ;must be declared for linker (ld)
_start: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!', 0xa ;string to be printed
len equ $ - msg ;length of the string
编译并执行上述代码时,会产生以下结果 -
Hello, world!
编译和链接NASM中的汇编程序
确保在PATH环境变量中设置了nasm和ld二进制文件的路径。 现在,采取以下步骤来编译和链接上述程序 -
使用文本编辑器键入上面的代码并将其另存为hello.asm。
确保您与保存hello.asm目录位于同一目录中。
要组装程序,请键入nasm -f elf hello.asm
如果有任何错误,将在此阶段提示您。 否则,将创建名为hello.o的程序的目标文件。
要链接目标文件并创建名为hello的可执行文件,请键入ld -m elf_i386 -s -o hello hello.o
键入./hello执行该程序
如果你已经完成了所有事情,它将显示“Hello,World!” 屏幕上。