汇编 - 基本语法

汇编程序可分为三个部分 :

  • 数据部分,

  • 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 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中编译和链接汇编程序

确保已设置 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!".