Assembly 基本语法 - Assembly汇编
汇编程序可以分为三个部分:
数据段
bss段部分
文字部分
数据段
用于声明初始化数据或常量的数据段。在运行时,此数据不改变。在本节中可以声明不同的常量值,文件名或缓冲区大小等。
声明数据段的语法是:
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
Assembly汇编语言语句
汇编语言程序包括三个类型的语句:
可执行指令或指令
汇编指令或伪操作
宏
可执行指令或简单指示告诉的处理器该怎么做。每个指令由操作码(操作码)可执行指令生成的机器语言指令。
汇编指令或伪操作告诉汇编有关汇编过程的各个方面。这些都是非可执行文件,并不会产生机器语言指令。
宏基本上是一个文本替换机制。
汇编语言语句的语法
汇编语言语句输入每行一个语句。每个语句如下的格式如下:
[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
Assembly Hello World程序
下面的汇编语言代码显示字符串 'Hello World'在屏幕上:
section .text
global _start ;must be declared for linker (ld)
_start: ;tells linker entry yiibai
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 ;our dear string
len equ $ - msg ;length of our dear string
上面的代码编译和执行时,它会产生以下结果:
Hello, world!
一个汇编程序的编译和链接在NASM
请确保已设置NASM和LD的二进制文件的路径在PATH环境变量中。现在上述程序的编译和链接采取以下步骤:
使用文本编辑器,输入上面的代码保存为hello.asm。
请确保hello.asm文件保存在同一目录
要汇编程序,请键入 nasm -f elf hello.asm
如果有错误将提示。否则hello.o程序将创建一个对象文件。
要链接目标文件,并创建一个可执行文件名hello,请键入 ld -m elf_i386 -s -o hello hello.o
通过输入执行程序 ./hello
如果所做的一切都是正确的,它会显示 Hello, world!在屏幕上。