linux 内核asmlinkage关键字总结

server/2024/11/13 9:10:09/

1,看一下asmlinkage的定义

CPP_ASMLINKAGE __attribute__((regparm(0)))

GCC中使用__attribute__((regparm(n)))指定最多可以使用n个寄存器(eax, edx, ecx)传递参数,n的范围是0~3,超过n时则将参数压入栈中(n=0表示不用寄存器传递参数)。

补充:C语言调用函数参数使用栈传递,有的说使用寄存器传递,上面的asmlinkage关键字主要用于这个作用,那么linux下有几个是使用栈传递,几个使用寄存器传递的呢。

#include <stdio.h>int fun(int a, int b, int c, int d, int e, int f, int g,int h)
{return a+b+c+d+e+f+g;
}int main() {int a = fun(1,2,3,4,5,6,7,8);return 0;
}

汇编查看

lark@ubuntu:~/test$ sudo gcc example.c  -o example -g
lark@ubuntu:~/test$ objdump -d example

0000000000001129 <fun>:
    1129:    f3 0f 1e fa              endbr64 
    112d:    55                       push   %rbp
    112e:    48 89 e5                 mov    %rsp,%rbp
    1131:    89 7d fc                 mov    %edi,-0x4(%rbp)
    1134:    89 75 f8                 mov    %esi,-0x8(%rbp)
    1137:    89 55 f4                 mov    %edx,-0xc(%rbp)
    113a:    89 4d f0                 mov    %ecx,-0x10(%rbp)
    113d:    44 89 45 ec              mov    %r8d,-0x14(%rbp)
    1141:    44 89 4d e8              mov    %r9d,-0x18(%rbp)
    1145:    8b 55 fc                 mov    -0x4(%rbp),%edx
    1148:    8b 45 f8                 mov    -0x8(%rbp),%eax
    114b:    01 c2                    add    %eax,%edx
    114d:    8b 45 f4                 mov    -0xc(%rbp),%eax
    1150:    01 c2                    add    %eax,%edx
    1152:    8b 45 f0                 mov    -0x10(%rbp),%eax
    1155:    01 c2                    add    %eax,%edx
    1157:    8b 45 ec                 mov    -0x14(%rbp),%eax
    115a:    01 c2                    add    %eax,%edx
    115c:    8b 45 e8                 mov    -0x18(%rbp),%eax
    115f:    01 c2                    add    %eax,%edx
    1161:    8b 45 10                 mov    0x10(%rbp),%eax
    1164:    01 d0                    add    %edx,%eax
    1166:    5d                       pop    %rbp
    1167:    c3                       retq   

0000000000001168 <main>:
    1168:    f3 0f 1e fa              endbr64 
    116c:    55                       push   %rbp
    116d:    48 89 e5                 mov    %rsp,%rbp
    1170:    48 83 ec 10              sub    $0x10,%rsp
    1174:    6a 08                    pushq  $0x8
    1176:    6a 07                    pushq  $0x7
    1178:    41 b9 06 00 00 00        mov    $0x6,%r9d
    117e:    41 b8 05 00 00 00        mov    $0x5,%r8d
    1184:    b9 04 00 00 00           mov    $0x4,%ecx
    1189:    ba 03 00 00 00           mov    $0x3,%edx
    118e:    be 02 00 00 00           mov    $0x2,%esi
    1193:    bf 01 00 00 00           mov    $0x1,%edi
    1198:    e8 8c ff ff ff           callq  1129 <fun>
    119d:    48 83 c4 10              add    $0x10,%rsp
    11a1:    89 45 fc                 mov    %eax,-0x4(%rbp)
    11a4:    b8 00 00 00 00           mov    $0x0,%eax
    11a9:    c9                       leaveq 
    11aa:    c3                       retq   
    11ab:    0f 1f 44 00 00           nopl   0x0(%rax,%rax,1)

我们可以看到edi,esi,edx,ecx,r8d,r9d这几个寄存器 访问,另外的两个为pushq(栈访问)。

 2,asmlinkage举例 


http://www.ppmy.cn/server/140786.html

相关文章

论文阅读《Structure-from-Motion Revisited》

摘要 增量式地运动结构恢复是从无序图像集合中进行三维重建的一个普遍策略。虽然增量式地重建系统在各个方面上都取得了巨大的进步&#xff0c;但鲁棒性、准确性、完整度和尺度仍然是构建真正通用管道的关键问题。我们提出了一种新的运动结构恢复技术&#xff0c;它改进了目前…

`psdparse`:解锁Photoshop PSD文件的Python密钥

文章目录 psdparse&#xff1a;解锁Photoshop PSD文件的Python密钥背景&#xff1a;为何选择psdparse&#xff1f;psdparse是什么&#xff1f;如何安装psdparse&#xff1f;简单函数使用方法应用场景常见Bug及解决方案总结 psdparse&#xff1a;解锁Photoshop PSD文件的Python密…

Git超详细教程

Git初始 概念 一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用 记录代码内容&#xff0c;&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 如何学&#xff1a; 个人本机使用&#xff1a;Git基础命令和概念 多…

【Windows】Android Studio 上cmd 换为Powershell 终端

最近在Windows 环境下Android Studio 的Terminal 终端&#xff0c;低版本默认用的是cmd.exe&#xff0c;好多linux 命令不支持&#xff0c;有时候一不小心就记忆错了&#xff1b;干脆直接换成Windows PowerShell 得了。 下载Powershell&#xff1a;https://aka.ms/PSWindows 选…

BP 网络的标准学习算法及其实现

BP 网络的标准学习算法及其实现 一、引言 BP&#xff08;Back Propagation&#xff09;神经网络是一种广泛应用于机器学习和人工智能领域的神经网络模型。它通过反向传播算法来调整网络的权重&#xff0c;以最小化预测输出和实际输出之间的误差。BP 网络的标准学习算法对于理…

git 多账号配置

windows下git多账号配置详解_git配置多个用户名和密码-CSDN博客 windows下git多账号配置详解_git配置多个用户名和密码-CSDN博客 windows下git多账号配置详解_git配置多个用户名和密码-CSDN博客

Ascend Extension for PyTorch的源码解析

1 源码下载 Ascend对pytorch代码的适配&#xff0c;可从以下链接中获取。 Ascend/pytorch 执行如下命令即可。 git clone https://gitee.com/ascend/pytorch.git2 目录结构解析 源码下载后&#xff0c;如果需要编译torch-npu&#xff0c;最好保持pytorch的源码版本匹配&…

设计模式-七个基本原则之一-开闭原则 + SpringBoot案例

开闭原则:(SRP) 面向对象七个基本原则之一 对扩展开放&#xff1a;软件实体&#xff08;类、模块、函数等&#xff09;应该能够通过增加新功能来进行扩展。对修改关闭&#xff1a;一旦软件实体被开发完成&#xff0c;就不应该修改它的源代码。 要看实际场景&#xff0c;比如组内…