汇编程序可分为三个部分 :
数据部分,
bss 部分,
text 部分.
数据部分
数据部分用于声明初始化数据或常量.此数据在运行时不会更改.您可以在本节中声明各种常量值,文件名或缓冲区大小等.
声明数据部分的语法是 :
section.data
bss 部分
bss 部分用于声明变量.声明bss部分的语法是 :
section.bss
文本部分
文本部分用于保存实际代码.本节必须以声明 global _start 开头,它告诉内核程序执行的开始位置.
声明文本部分的语法是 :
section.text global _start _start:
注释
汇编语言注释以分号(;)开头.它可能包含任何可打印的字符,包括空白.它可以单独显示在一行上,例如 :
; This program displays a message on screen
或者在同一行显示一条指令,如 :
add eax, ebx ; adds ebx to eax
汇编语言语句
汇编语言程序包含三种类型的语句 :
可执行指令或说明,
汇编程序指令或伪操作,以及
宏.
可执行指令或只是指令告诉处理器什么去做.每条指令由操作码(操作码)组成.每个可执行指令生成一个机器语言指令.
汇编程序指令或伪操作告诉汇编程序有关汇编过程的各个方面.这些是不可执行的,不会生成机器语言指令.
宏基本上是一种文本替换机制.
汇编语言语句的语法
汇编语言语句每行输入一个语句.每个语句遵循以下格式 :
[label] mnemonic [operands] [;comment]
方括号中的字段是可选的.基本指令有两部分,第一部分是要执行的指令(或助记符)的名称,第二部分是操作数或命令的参数.
以下是典型汇编语言陈述的一些示例 :
INC COUNT ; Increment the memory variable COUNTMOV 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 MARKSMOV 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 movedx,len ;message length movecx,msg ;message to write movebx,1 ;file descriptor (stdout) moveax,4 ;system call number (sys_write) int0x80 ;call kernel moveax,1 ;system call number (sys_exit) int0x80 ;call kernelsection.datamsg db 'Hello, world!', 0xa ;string to be printedlen equ $ - msg ;length of the string
编译并执行上述代码时,会产生以下结果 :
Hello, world!
在NASM中编译和链接汇编程序
确保已设置 nasm
使用文本编辑器输入上述代码,将其保存为hello.asm.
确保您与保存 hello.asm 的目录位于同一目录.
要组装程序,请键入 nasm -f elf hello.asm
如果有任何错误,将在此阶段提示您.否则,将创建名为 hello.o 的程序的目标文件.
要链接目标文件并创建名为hello的可执行文件,请键入 ld -m elf_i386 -s -o hello hello.o
输入 ./hello
执行程序
如果你已经正确地完成了所有事情,它将在屏幕上显示"Hello,world!".