linux64参数传递方式

本文通过示例代码展示了在Linux64环境下,调用一个带有8个参数的函数时,参数如何通过寄存器和堆栈进行传递。前6个参数分别由edi, esi, edx, ecx, r8d, r9d寄存器承载,剩余参数则存储在堆栈中。" 91356037,8515787,Django电商网站商品模块实现与优化,"['Django', '电商开发', 'Web开发', '搜索引擎', '缓存技术']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调用有八个参数的函数:
eight_p.c
   1 #include
   
   3 void eight_f(char b,short c, int d, long e,int f,int g,int h,int k)
   4 {}
   
   6 int main(int argc,char*argv[])
   7 {
   8  eight_f(1,2,3,4,5,6,7,8);
   9 }

gcc -S eight_p.c
得到eight_p.s汇编文件:
   1        .file  "eight_p.c"
   2       .text
   3 .globl eight_f
   4        .type  eight_f, @function
   5 eight_f:
   6 .LFB0:
   7       .cfi_startproc
   8        pushq  %rbp
   9       .cfi_def_cfa_offset 16
  10        movq   %rsp, %rbp
  11        .cfi_offset 6, -16
  12        .cfi_def_cfa_register 6
  13        movl   %esi, %eax
  14        movl   %edx, -12(%rbp)
  15        movq   %rcx, -24(%rbp)
  16        movl   %r8d, -28(%rbp)
  17        movl   %r9d, -32(%rbp)
  18        movb   %dil, -4(%rbp)
  19        movw   %ax, -8(%rbp)
  20        leave
  21        .cfi_def_cfa 7, 8
  22        ret
  23        .cfi_endproc
  24 .LFE0:
  25        .size  eight_f, .-eight_f
  26 .globl main
  27        .type  main, @function
  28 main:
  29 .LFB1:
  30        .cfi_startproc
  31        pushq  %rbp
  32        .cfi_def_cfa_offset 16
  33        movq   %rsp, %rbp
  34        .cfi_offset 6, -16
  35        .cfi_def_cfa_register 6
  36        subq   $32, %rsp
  37        movl   %edi, -4(%rbp)
  38        movq   %rsi, -16(%rbp)
  39        movl   $8, 8(%rsp)
  40        movl   $7, (%rsp)
  41        movl   $6, %r9d
  42        movl   $5, %r8d
  43        movl   $4, %ecx
  44        movl   $3, %edx
  45        movl   $2, %esi
  46        movl   $1, %edi
  47        call   eight_f
  48        leave
  49        .cfi_def_cfa 7, 8
  50        ret
  51        .cfi_endproc
  52 .LFE1:
  53        .size  main, .-main
  54        .ident "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
  55        .section      .note.GNU-stack,"",@progbits

可知前六个参数通过寄存器edi esi edx ecx r8d r9d传递,六个以后的参数通过堆栈传递。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值