【问题标题】:C calling ASM (YASM x86)C 调用 ASM (YASM x86)
【发布时间】:2018-09-29 00:51:27
【问题描述】:

我想在c代码中调用ASM函数,如何将参数传递给ASM代码?

#include <stdio.h>

extern int * asm_mod_array(int *ptr,int size);
 int main()
 {
int fren[5]={1,2,3,4,5};

/*Call ASM func*/
int a=asm_mod_array(fren,5);
printf(u,a);
return 0;   
 }

现在,我想在我的 ASM 函数中使用这个参数。

;asm_mod_array(int ptr,int size)


global asm_mod_array

asm_mod_array:
push r12
mov rdi, 0
mov rsi, 0

mov r12,0
mov rax,0

sumLoop:

add rax, [rdi+r12]
inc r12
cmp r12, rsi
jl sumLoop

mov [rdx], rax
pop r12
ret

注意:ASM 代码中的 0,必须用 c 传递的参数进行更改。

【问题讨论】:

  • 您为哪个操作系统编程?

标签: c function assembly nasm yasm


【解决方案1】:

您可以根据平台的 AA64 调用约定访问参数。在除 Windows 之外的大多数系统上,这是由 System V AMD64 ABI 定义的。

根据这些调用约定,ptr 将位于 rdi 中,size 将位于 rsi 中。返回值放在rax中。

X86 calling conventions

【讨论】:

  • 这就是我所看到的,我认为我需要手动将值放在寄存器上,但是编译器自己做,谢谢你的帮助。
  • AA64?这是 AArch64 的缩写吗?我假设您的意思是说 x86-64 调用约定?或者更好的是,“您平台的 C 调用约定”。
  • 是的,AA64 表示 AMD 架构 64 位,就像 IA32 表示 Intel 架构 32 位一样。这些基本上是指x86-64和x86,但是很多技术文档将它们称为IA32和AA64。
猜你喜欢
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 2012-05-09
  • 1970-01-01
相关资源
最近更新 更多