标签:std 系统 csdn x86_64 int main block 阅读 执行文件
在阅读《程序员的自我修养--链接装载与库》的第四章 ==静态链接== 4.6.2==最小的程序==时,发现代码是基于linux32位系统的程序,无法在64位系统上编译和运行。
正确的64位程序应该为
char *str = "Hello world!\n";
void print(){
asm("movq $13,%%rdx \n\t"
"movq %0,%%rsi \n\t"
"movq $0,%%rdi \n\t"
"movq $1,%%rax \n\t"
"syscall \n\t"
::"r"(str) : "rdx", "rsi", "rdi");
}
void exit(){
asm("movq $42,%rdi \n\t"
"movq $60,%rax \n\t"
"syscall \n\t");
}
void nomain(){
print();
exit();
}
linux系统中64位汇编和32位汇编的系统调用主要有以下不同:
- 系统调用号不同.比如x86中sys_write是4,sys_exit是1;而x86_64
sys_write是1, sys_exit是60。linux系统调用号实际上定义在/usr/include/asm/unistd_32.h和/usr/include/asm/unistd_64.h中。- 系统调用所使用的寄存器不同,x86_64中使用与eax对应的rax传递系统调用号,但是 >x86_64中分别使用rdi/rsi/rdx传递前三个参数,而不是x86中的ebx/ecx/edx。
- 系统调用使用“syscall”而不是“int 80”
标签:std 系统 csdn x86_64 int main block 阅读 执行文件
原文地址:https://www.cnblogs.com/LiShiZhen/p/11494429.html