15得票3回答
x86调用约定:通过堆栈传递的参数应该是只读的吗?

看起来最先进的编译器将通过栈传递的参数视为只读。请注意,在x86调用约定中,调用者将参数推入堆栈,被调用者使用堆栈中的参数。例如,以下C代码:extern int goo(int *x); int foo(int x, int y) { goo(&x); return x; }...

15得票1回答
“extern'C'”是函数类型的一部分吗?

除了链接相关的内容,标准中没有任何关于评论的信息。虽然标准没有提到调用约定,但在现实世界中,C和C++之间的调用约定可能不同,因此我认为C函数和C++函数的类型是不同的。但是在GCC中似乎不是这样的。#include <type_traits> extern "C" { in...

14得票2回答
函数返回结构体的调用约定

以下是一段 C 代码:struct _AStruct { int a; int b; float c; float d; int e; }; typedef struct _AStruct AStruct; AStruct test_callee5(...

14得票1回答
RISC-V调用约定的ABI寄存器名称

我对RISC-V ABI寄存器名称感到困惑。例如,“RISC-V指令集手册,卷I:用户级ISA,版本2.0”第85页的表18.2指定堆栈指针sp是寄存器x14。然而,指令addi sp,zero,0 使用riscv64-unknown-elf-as进行编译,-m32无影响,结果是0x00000...

14得票2回答
有人能解释一下__declspec(naked)吗?

我正在考虑将为Windows编写的脚本引擎移植到Linux,这是针对Winamp的可视化平台AVS进行的。目前我不确定是否可能。据我所知,该代码正在获取C函数nseel_asm_atan和nseel_asm_atan_end的地址,并将它们存储在一个表中,以便在代码执行期间可以引用。 我查看...

14得票2回答
什么是参数推送顺序?

我正在学习汇编语言。什么是参数推送顺序?我知道这是如何将参数推送到堆栈中,但是“左侧”和“右侧”的含义是什么?相对于什么的左侧或右侧?还是这只与命令的语义书写方式有关,例如:mov ebp, esp ;esp is moved into ebp, right to le...

14得票4回答
可变参数函数在机器代码中如何确定参数数量?

可变参数函数(如printf)如何找到它们接收到的参数数量? 很明显,参数的数量不会作为(隐藏的)参数传递(请参见此处汇编代码中对printf的调用)。 那么这个技巧是什么呢?

14得票1回答
在x86-64 SysV ABI中,参数和返回值寄存器的高位是否允许垃圾值?

x86-64 SysV ABI规定了函数参数如何在寄存器中传递(第一个参数在rdi中,然后是rsi等等),以及整数返回值如何传回(在rax中,对于非常大的值则在rdx中)。 然而,我找不到的是,在传递小于64位的类型时,参数或返回值寄存器的高位应该是什么。 例如,对于以下函数: void...

14得票1回答
为什么在不使用堆栈内存的情况下会分配堆栈内存?

考虑以下例子:struct vector { int size() const; bool empty() const; }; bool vector::empty() const { return size() == 0; } 通过优化的clang编译器生成的ve...

13得票2回答
在Java中,“this”引用存储在调用堆栈上吗?

我们已经知道,在Java中调用方法时,参数和局部变量将被存储在堆栈上。 例如以下代码:public class Test { int x = 10; int y = 20; void test(int y) { int z = y; ...