汇编语言 语法

汇编程序可以分为 3 个段,

  • data
  • bss
  • text

data 段

data(数据)段被用于声明初始化的数据或常数。此数据在运行时不会更改。您可以在段中声明各种常量值,文件名或缓冲区大小等。

声明数据段的语法是,

  1. section.data

bss 段

bss 段用于声明变量。

声明 bss 段的语法是,

  1. section.bss

text 段

text 段被用于保持实际的代码。该段必须以全局声明 _start 开头,该声明告诉内核程序从何处开始执行。

声明代码段的语法是,

  1. section.text
  2. global _start
  3. _start:

注释

汇编语言注释以分号(;)开头。它可以包含任何可打印字符,包括空格。它可以单独出现在一行上,例如-

  1. ; 该程序在屏幕上显示一条消息

或者,与指令在同一行上,例如,

  1. add eax, ebx ; 加上 ebx eax

汇编语言声明

汇编语言程序包含 3 种类型的语句:

  • 可执行指令或说明
  • 汇编程序指令或伪操作

可执行指令 或简单的 指令 告诉处理器做什么。每个指令由一个 操作码(opcode)组成。每个可执行指令生成一个机器语言指令。

汇编指令伪操作 告诉汇编器关于程序的各个方面。这些是不可执行的,不会生成机器语言指令。

宏基本上是一种代码替换机制。


汇编语言语句的语法

汇编语言语句每行输入一个语句。每个语句遵循以下格式,

  1. [label] mnemonic [operands] [;comment]

方括号中的字段是可选的。基本指令包括两段,第一段是要执行的指令(或助记符)的名称,第二段是命令的操作数或参数。

以下是一些典型汇编语言语句的实例:

  1. INC COUNT ; 增加内存变量 COUNT
  2. MOV TOTAL, 48 ; 将值 48 转移到
  3. ; 内存变量 TOTAL
  4. ADD AH, BH ; 添加寄存器 BH 内容
  5. ; AH 寄存器
  6. AND MASK1, 128 ; 对变量 MASK1 128
  7. ; 执行 AND 操作
  8. ADD MARKS, 10 ; 10 加到变量 MARKS
  9. MOV AL, 10 ; 将值 10 传送到 AL 寄存器

汇编语言的 Hello World 程序

以下汇编语言代码在屏幕上显示 "Hello World"

  1. section .text
  2. global _start ;必须为链接器(ld)声明
  3. _start: ;告诉链接器入口点
  4. mov edx,len ;消息长度
  5. mov ecx,msg ;写消息
  6. mov ebx,1 ;文件描述符 (stdout)
  7. mov eax,4 ;系统调用号 (sys_write)
  8. int 0x80 ;调用内核
  9. mov eax,1 ;系统调用号 (sys_exit)
  10. int 0x80 ;调用内核
  11. section .data
  12. msg db 'Hello, world!', 0xa ;要打印的字符串
  13. len equ $ - msg ;字符串的长度

结果如下:

  1. Hello, world!

在 NASM 中编译和链接汇编程序

确保已在 PATH 环境变量中设置了 nasmld 二进制文件的路径。

现在,执行以下步骤来编译和链接上述程序:

  • 使用代码编辑器输入以上代码,并将其另存为 hello.asm
  • 确保您与保存 hello.asm 的位置位于同一目录中。
  • 要组装程序,请输入 nasm -f elf hello.asm 并回车。
  • 如果有任何错误,现阶段将提示您错误信息。否则,将创建名为 hello.o 的程序的目标文件。
  • 要链接目标文件并创建一个名为 hello 的可执行文件,请输入 ld -m elf_i386 -s -o hello hello.o
  • 最后输入 ./hello 执行程序。

如果您正确完成了所有操作,则会在屏幕上显示 "Hello,World!" 。