Assembly

Prerequisity

sudo apt install nasm

x86

  1. 编写代码:

    main.asm:

    section .data
        msg db 'Hello, World!', 0xA  ; 定义字符串,0xA 是换行符
    
    section .text
        global _start
    
    _start:
        ; 系统调用:write(1, msg, 13)
        mov eax, 4          ; 系统调用号 (sys_write)
        mov ebx, 1          ; 文件描述符 1 (stdout)
        mov ecx, msg        ; 指向要写的字符串
        mov edx, 13         ; 字符串长度
        int 0x80            ; 调用内核
    
        ; 系统调用:exit(0)
        mov eax, 1          ; 系统调用号 (sys_exit)
        xor ebx, ebx        ; 返回码 0
        int 0x80            ; 调用内核
    
  2. 编译:

    nasm -o main.o -f elf32 main.asm
    
  3. 链接:

    ld -o main -m elf_i386 main.o
    
  4. 运行:

    ./main
    

x86-64

  1. 编写代码:

    main.asm:

    section .data
        msg db 'Hello, World!', 0xA  ; 定义字符串,0xA 是换行符
        msg_len equ $ - msg          ; 计算字符串长度
    
    section .text
        global _start
    
    _start:
        ; 系统调用:write(1, msg, msg_len)
        mov rax, 1          ; 系统调用号 (sys_write)
        mov rdi, 1          ; 文件描述符 1 (stdout)
        mov rsi, msg        ; 指向要写的字符串
        mov rdx, msg_len    ; 字符串长度
        syscall             ; 调用内核
    
        ; 系统调用:exit(0)
        mov rax, 60         ; 系统调用号 (sys_exit)
        xor rdi, rdi        ; 返回码 0
        syscall             ; 调用内核
    

    这里使用的是 64 位 Linux 系统调用约定,注意与 32 位版本的区别(如寄存器的使用和系统调用的指令)。在 x86-64 架构中,syscall 指令用于发起系统调用,而不同于 32 位架构中的 int 0x80

  2. 编译:

    nasm -o main.o -f elf64 main.asm
    
  3. 链接:

    ld -o main main.o
    
  4. 运行:

    ./main
    

参见:在 Apple Silicon Mac 上入门汇编语言 | Evian-Zhang

posted @ 2025-05-21 01:04  Undefined443  阅读(18)  评论(0)    收藏  举报