系统调用与函数调用传参方式

系统调用参数传递

x86_32

通过中断(int 0x80)来实现

寄存器 eax 中存放系统调用号,同时系统调用返回值也存放在 eax 中

当系统调用参数小于等于6个时,参数则必须按顺序放到寄存器 ebx,ecx,edx,esi,edi ,ebp中

当系统调用参数大于6个时,全部参数应该依次放在一块连续的内存区域里,同时在寄存器 ebx 中保存指向该内存区域的指针

顺序寄存器
第一个参数ebx
ecx
edx
esi
edi
ebp
大于六个时,全部参数存放在一块连续的内存中中,同时ebx中保存着指向该内存的指针

x86_64

通过中断(syscall)指令来实现

寄存器 eax 中存放系统调用号,同时系统调用返回值也存放在 eax 中

当系统调用参数小于等于6个时,参数则必须按顺序放到寄存器 rdi,rsi,rdx,r10,r8,r9中

当系统调用参数大于6个时,全部参数应该依次放在一块连续的内存区域里,同时在寄存器 ebx 中保存指向该内存区域的指针

顺序寄存器
第一个参数rdi
rsi
rdx
r10
r8
r9
大于六个时,全部参数存放在一块连续的内存中中,同时ebx中保存着指向该内存的指针

函数参数传递

x86_32

C调用约定(即用__cdecl关键字说明)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。

gcc 通过栈来传递参数的

通过栈来传递参数

x86_64

当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。当参数为 7 个以上时, 前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中。

顺序寄存器
第一个参数rdi
rsi
rdx
rcx
r8
r9
大于六个时,前六个参数依然存放在寄存器中,多出来的从右到左压入栈中

参考链接:
系统调用和函数参数传递

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当你想要在你的代码中展现一些自定义的函数时,可以使用函数的封装来实现。函数的封装可以让你在代码中更加方便地调用你的函数,并且可以让代码更加模块化和可读性更高。 在封装一个函数时,你需要考虑这个函数需要接收哪些参数参数可以是任何数据类型,包括数字、字符串、列表、字典等等。你需要在函数定义时指定这些参数,并且在函数体内使用这些参数完成你的逻辑。 下面是一个简单的示例代码,展示了如何定义一个带有参数的函数,并且如何调用这个函数: ```python def say_hello(name): print("Hello, " + name + "!") say_hello("Alice") ``` 在上面的代码中,我们定义了一个叫做 `say_hello` 的函数,这个函数接收一个名字参数。在函数体内,我们使用 `print()` 函数输出一句问候语,其中包含了传入的名字参数。最后,我们调用函数并传入了一个名字参数 `"Alice"`,这样函数就会输出一句问候语,包含了这个名字。 当你想要传入多个参数时,可以在函数定义时指定多个参数,用逗号隔开。当你调用函数时,需要按照函数定义的顺序传入参数,每个参数之间也用逗号隔开。例如: ```python def add_numbers(a, b): result = a + b print("The result is: " + str(result)) add_numbers(2, 3) ``` 在上面的代码中,我们定义了一个叫做 `add_numbers` 的函数,这个函数接收两个数字类型的参数 `a` 和 `b`。在函数体内,我们使用这两个参数计算了它们的和,并且输出了结果。在函数调用时,我们传入了两个数字类型的参数 `2` 和 `3`,这样函数就会输出它们的和 `5`。 希望这个简单的示例能够帮助你更好地理解函数的封装和参数传递的概念。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值