📜  nasm (1)

📅  最后修改于: 2023-12-03 15:17:50.222000             🧑  作者: Mango

NASM - 汇编语言编译器

NASM(全称Netwide Assembler)是一款用于x86系列计算机的开源汇编语言编译器。它支持多种目标文件格式,包括Linux、Windows以及BSD操作系统。

安装

如果你使用的是Linux操作系统,你可以从软件包管理器中安装。

但是如果你使用的是Windows或macOS操作系统,你可以直接从官网中下载最新版本的NASM编译器。

使用
编译

假设我们有一个简单的程序,它打印“Hello, World!”:

section .data
msg     db      'Hello, World!', 0

section .text
global _start

_start:
    ; write
    mov     eax, 4          ; syscall number for write
    mov     ebx, 1          ; file descriptor for stdout
    mov     ecx, msg        ; buffer
    mov     edx, 13         ; length of msg
    int     0x80            ; system call
    
    ; exit
    mov     eax, 1          ; syscall number for exit
    xor     ebx, ebx        ; exit code
    int     0x80            ; system call

我们可以使用NASM编译器将其编译成可执行文件:

nasm -f elf32 -o hello.o hello.asm
ld -m elf_i386 -o hello hello.o
./hello
调试

NASM编译器支持在GDB中调试汇编程序。在编译时,我们需要使用调试标志:

nasm -f elf32 -g -o hello.o hello.asm

然后我们启动GDB,加载可执行文件并开始调试:

gdb hello
(gdb) break _start
(gdb) run
(gdb) disassemble _start
(gdb) stepi
(gdb) info registers
语法

NASM有着其自己的汇编语言语法,与AT&T汇编语法不同。它更为易于阅读和编写。

下面是一些NASM的语法特性:

  • 标签以“:”结尾,例如:_start:
  • 指令以英文字母书写,例如:movaddsubjmp
  • 操作数通常以dst, src的形式给出
  • 直接将汇编指令转换为机器代码时,不需要添加前缀操作符$,例如:mov eax, 0
  • 操作数大小可以使用后缀来指定,例如:mov eax, dword[ebp+8]

更多语法特性可以在NASM官网找到。

总结

NASM是一款易于阅读和编写的汇编语言编译器。它被广泛用于x86系列计算机以及其他体系结构的编程。它也支持多种目标文件格式,使得它成为编写跨平台汇编程序的理想选择。