【问题标题】:Passing Parameters in 64 bit Assembly Function from C language. Which Register Receive These Parameter?从 C 语言中以 64 位汇编函数传递参数。哪个寄存器接收这些参数?
【发布时间】:2013-05-03 15:41:04
【问题描述】:

我想从 C 向汇编函数传递一个参数。

在类 UNIX 系统上,前六个参数分别位于 rdi、rsi、rdx、rcx、r8 和 r9。

在 Windows 上,前四个参数进入 rcx、rdx、r8 和 r9。

现在,我的问题是:在 BIOS 或 DOS 编程级别,哪些寄存器接收这些参数?如果参数个数超过6个,如何编写程序集来处理这些参数?

【问题讨论】:

  • 如果您需要控制参数从 C 到哪里(在哪个寄存器中)以与“自定义”函数(符合其自己的调用约定)正确接口,您可能需要使用编译器的一些特殊功能。当寄存器不够用时,您可能需要堆栈(或一个指向参数“数组”的寄存器)(参见例如en.wikipedia.org/wiki/X86_calling_conventions
  • 也许,使用 asmlinkage 并通过堆栈传递 arg。

标签: c assembly x86-64 calling-convention


【解决方案1】:

如果我理解您问题的第一部分,则实际上并不支持在 16 位模式下使用 C(因为 16 位模式使用分段来获得超过 16 位的寻址)。

参考第二部分,这取决于编译器,但 Windows 和 Unix 的 IIRC 都会在堆栈上传递额外的参数(有关参数传递的更多信息,请参阅 http://en.wikipedia.org/wiki/X86_calling_conventions)。

【讨论】:

    【解决方案2】:

    64 位 UEFI 使用 Windows 约定。

    BIOS 和 DOS API 是用汇编语言定义的。

    传统上,在 16 位和 32 位 x86 中,所有参数都存储在堆栈中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-16
      • 2020-06-07
      • 2019-02-12
      • 1970-01-01
      • 2016-10-01
      • 2013-06-30
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多