程序员的自我修养4.6.2 最小的程序在x86_64的实现

原书是32位的汇编,现在改成64位的,在linux下的gcc和ld测试通过

// TinyHelloWorld.c
char* str = "Hello world!\n";

void print() {
  asm volatile (
    "mov $1, %%rax     \n\t"  // syscall 1 = write (64位)
    "mov $1, %%rdi     \n\t"  // fd = 1 (stdout)
    "mov %0, %%rsi     \n\t"  // 字符串地址
    "mov $13, %%rdx    \n\t"  // 字符串长度
    "syscall           \n\t"  // 64位系统调用指令
    : 
    : "r"(str)         // 输入:str通过寄存器传递
    : "rax", "rdi", "rsi", "rdx" // 声明被修改的寄存器
  );
}

void exit() {
  asm volatile (
    "mov $60, %%rax    \n\t"  // syscall 60 = exit (64位)
    "mov $42, %%rdi    \n\t"  // 退出状态码
    "syscall           \n\t"
    :
    : 
    : "rax", "rdi"
  );
}

void nomain() {
  print();
  exit();
}

shell log

ubuntu@ubuntu:~/cstudy$ gcc -c -fno-builtin TinyHelloWorld.c
ubuntu@ubuntu:~/cstudy$ ld -static -e nomain -o TinyHelloWorld TinyHelloWorld.o
ubuntu@ubuntu:~/cstudy$ ls
Makefile        TinyHelloWorld    TinyHelloWorld.o  hello.c   hello.mod    hello.mod.o  modules.order
Module.symvers  TinyHelloWorld.c  chardevice        hello.ko  hello.mod.c  hello.o
ubuntu@ubuntu:~/cstudy$ ./TinyHelloWorld
Hello world!
posted @ 2025-04-30 17:39  奔付山河  阅读(14)  评论(0)    收藏  举报