登录/注册

nasm

更多

好的!NASM 是用中文回答:

NASM 的全称是 Netwide Assembler

它是一个广泛应用于 x86 和 x86-64 架构汇编语言编译器

以下是关于 NASM 的关键信息(中文解释):

  1. 用途:

    • 将人类可读的汇编语言源代码(通常是 .asm 文件)翻译(汇编)成计算机可执行的机器码
    • 输出结果是目标文件(通常是 .o.obj 文件),包含机器指令、数据以及链接器需要的信息。
  2. 主要特点和优势:

    • 跨平台: 可以在多种操作系统上运行,包括 Windows, Linux, macOS, DOS 等。
    • 开源免费: 遵循 BSD 许可证,可自由使用和修改。
    • 强大灵活: 语法相对简洁清晰(类似于 Intel 语法),支持从古老的 16 位代码到最新的 64 位指令集和各种扩展(如 SSE, AVX 等)。
    • 模块化: 支持宏(macro)和包含文件(%include),方便代码复用和组织。
    • 流行度高: 在 Linux 开发、操作系统开发、引导程序(Bootloader)开发、底层系统编程、逆向工程和性能关键的代码优化等领域非常流行。
    • 支持多种输出格式: 可以生成多种目标文件格式,最常见的有:
      • elf / elf64:Linux 和许多 Unix-like 系统使用的格式。
      • win32 / win64:Windows 系统使用的 COFF/PE 格式。
      • macho / macho64:macOS 使用的 Mach-O 格式。
      • bin:生成纯二进制映像(常用于引导扇区或没有操作系统的嵌入式程序)。
  3. 基本工作流程:

    1. 程序员编写汇编源代码文件 (myprogram.asm)。
    2. 使用 NASM 汇编器 编译源代码:
      nasm -f <输出格式> <输入文件.asm> -o <输出文件.o>
      • 例如,在 Linux 上编译 64 位程序:nasm -f elf64 myprogram.asm -o myprogram.o
    3. 使用链接器(如 Linux 的 ld 或 Windows 的 link.exe / gcc)将一个或多个目标文件以及所需的库文件链接成最终的可执行文件(a.out, .exe 等)或库文件(.so, .dll, .a 等):
      • 例如:ld myprogram.o -o myprogram (Linux, 简单链接)
      • 或者:gcc myprogram.o -o myprogram (Linux, 使用 GCC 链接并包含标准库等)
    4. 运行生成的可执行文件。
  4. 语法特点 (对比 MASM/TASM/GAS):

    • [ ] 表示内存地址: 这是 NASM 最显著的特点之一。访问内存内容必须用方括号括起来。
      • mov eax, ebx : 将寄存器 ebx 的值复制到寄存器 eax
      • mov eax, [ebx] : 将内存地址 ebx 指向的双字(4字节)内容复制到寄存器 eax
    • 尺寸操作符: 在操作数前显式指明操作的数据大小(字节、字、双字等)。
      • mov byte [var], 5 : 将数值 5 存入字节大小的变量 var 的内存位置。
      • mov word [buffer], ax : 将寄存器 ax (16位) 的值存入字大小的 buffer 起始位置。
      • mov dword [counter], 100 : 将数值 100 存入双字大小的 counter 内存位置。
    • 宏系统: 支持强大的单行和多行宏 (%macro, %endmacro),用于简化重复代码或创建类似函数的结构。
    • 标签(Labels): 以冒号 : 结尾定义标签,用于标记代码或数据的位置(分支跳转目标、数据变量地址等)。
    • 段(Sections): 使用 sectionsegment 指令定义代码段 (.text)、数据段 (.data)、未初始化数据段 (.bss) 等。
      • section .data:初始化数据段。
      • section .bss:未初始化数据段(用于声明缓冲区等)。
      • section .text:代码段。
  5. 一个简单的 Linux 64 位 NASM 程序示例 (调用 sys_write 和 sys_exit):

    section .data                   ; 数据段
        msg db '你好,世界!', 0xA ; 定义字符串 '你好,世界!' 后跟换行符 (0xA)
        len equ $ - msg             ; 计算字符串长度 ($ 当前地址 - msg 起始地址)
    
    section .text                   ; 代码段
        global _start               ; 告诉链接器程序入口点是 _start
    
    _start:
        ; 系统调用号 (sys_write) -> rax
        mov rax, 1                  ; 1 是 sys_write 的系统调用号
        ; 文件描述符 (stdout) -> rdi
        mov rdi, 1                  ; 1 是标准输出 (stdout)
        ; 消息地址 -> rsi
        mov rsi, msg
        ; 消息长度 -> rdx
        mov rdx, len
        syscall                     ; 触发系统调用
    
        ; 系统调用号 (sys_exit) -> rax
        mov rax, 60                 ; 60 是 sys_exit 的系统调用号
        ; 退出状态码 -> rdi
        mov rdi, 0                  ; 退出状态码 0 (成功)
        syscall                     ; 触发系统调用

编译链接运行 (Linux x86-64):

nasm -f elf64 hello.asm -o hello.o  # 汇编
ld hello.o -o hello                 # 链接
./hello                            # 运行
# 输出: 你好,世界!

总结:

NASM 是一个功能强大、灵活且广泛使用的开源汇编器,主要用于为 x86/x86-64 CPU 编写底层程序。它的语法清晰(尤其是使用 [ ] 明确表示内存访问),支持多种平台和输出格式,是学习汇编语言、进行系统编程和性能优化的重要工具。

你想了解 NASM 的特定方面吗?例如安装、更复杂的语法、宏、与链接器配合、在特定操作系统上的使用,或者如何调试 NASM 程序?

【KV260技术分享】宿主机构建Gstreamer

mjpegtools直接 ../configure --prefix=/usr/local 依赖: nasm https://www.nasm.us/ 这个不支持创建子目录编译,必须在源码根目录 同时这个是需要

2023-10-10 23:47:33

在C中使用汇编程序的原因是?

存在缺点。汇编语言的书写格式必须是编译器使用的格式。目前没有一个编译器支持NASM格式。不同的编译器要求使用不同的格式。Borland和Microsoft要求使用MASM格式。DJGPP和Linux中gcc要求使用GAS格式。在PC机上,调用汇编子程序是更标准的技术。

2023-04-04 15:00:32

NASM0-S6701-TP40

M.2 M KEY H4.0

2023-03-28 18:14:17

x86汇编语言从实模式到保护模式的电子教程免费下载

的运行机制,学习汇编语言是必不可少的。这套图书分为两册,采用开源的 NASM 汇编语言编译器和 VirtualBox 虚拟机软件,以个人计算机广泛采用的 Intel 处理器为基础,详细讲解了 Intel 处理器的指令系统和工作模式,以大量的代码演示了

资料下载 方式都 2020-07-14 08:00:00

NASM0-S6701-TPH4

M.2 M KEY H3.0

2023-03-28 18:14:16

二进制文件是如何进行反汇编和汇编的

二进制文件(嵌入式,纯二进制格式的文件)除了nasm可以汇编,使用gas也可以的(base) [myhaspl@localhost gasm]$ cat test3.asm.global

2021-12-20 07:54:26
7天热门专题 换一换
相关标签