链接,装载与库--“最小的程序“在64位系统下运行

在阅读《程序员的自我修养–链接装载与库》的第四章 静态链接 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”
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值