使用库函数API和C代码中嵌入汇编代码两种方式使用系统调用

陈可 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
#include<stdio.h>
int main(){
    int uid;
    __asm__ __volatile__(
        "mov $24,%%eax\n\t"
        "int $0x80\n\t"
        "mov %%eax,%0\n\t"
        :"=m"(uid)
    );
    printf("asm_result=%d\napi_result=%d\n",uid, getuid());
    return 0;
}

这里写图片描述

反汇编:
main:
    pushl   %ebp
    movl    %esp, %ebp
    andl    $-16, %esp #是为了对齐到16字节的边界
                       #深入理解计算机系统一书P154这样描述:
                       #“GCC坚持一个x86编程指导方针,
                       #也就是一个函数使用的所有栈空间必须是16字节的整数倍
    subl    $32, %esp #为函数分配变量空间,并且也为了对齐.
#APP
# 4 "test1.c" 1
    mov $24,%eax
    int $0x80
    mov %eax,28(%esp)

# 0 "" 2
#NO_APP
    call    getuid
    movl    28(%esp), %edx
    movl    %eax, 8(%esp)
    movl    %edx, 4(%esp)
    movl    $.LC0, (%esp)
    call    printf
    movl    $0, %eax
    leave
    ret

总结:

汇编部分通过int 指令int $0x80指令触发一个软中断产生128(0x80)中断向量,并传递参数(存在%eax),根据这个中断向量找到对应的中断服务程序(中断向量128对应的中断服务程序就是系统调用处理程序),系统调用处理程序中根据参数找到对应的系统调用服务例程并调用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值