程序员的自我修养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!