Python
Java
PHP
IOS
Android
Nodejs
JavaScript
Html5
Windows
Ubuntu
Linux
x86_64 调用约定和堆栈帧
我试图理解 GCC 4 4 3 为 Ubuntu Linux 下运行的 x86 64 机器生成的可执行代码 特别是 我不明白代码如何跟踪堆栈帧 过去 在 32 位代码中 我习惯于在几乎每个函数中看到这个 序言 push ebp movl e
c
stack
x8664
callingconvention
Backtrace
x86-64 上的 C++:何时在寄存器中传递和返回结构/类?
假设 Linux 上的 x86 64 ABI 在 C 中的什么条件下 结构会传递给寄存器中的函数 还是传递给堆栈上的函数 在什么条件下它们会返回到寄存器中 答案会随着课程的变化而变化吗 如果有助于简化答案 您可以假设单个参数 返回值并且没有
c
Assembly
x8664
callingconvention
ABI
stdcall 可以有可变参数吗?
据我所知 只有 caller clean stack 约定可以使用变量参数 顺便说一句 WinApi StringCchPrintfW 是这样声明的 我删除了 SAL 内联 HRESULT stdcall字符串CchPrintfW STRS
Windows
WINAPI
callingconvention
stdcall
variadicfunctions
64 位 .NET 应用程序中是否会忽略 CallingConvention?
当通过 P Invoke 通过显式 64 位 NET 应用程序与 64 位本机库交互时 调用约定 https msdn microsoft com en us library system runtime interopservices c
c
NET
pinvoke
callingconvention
将函数作为参数传递
我编写了函数 A 它将调用许多其他函数之一 为了节省重写函数 A 我想将要调用的函数作为函数 A 的参数传递 例如 function A Param functionToCall Write Host I m calling functio
PowerShell
parameterpassing
callingconvention
x86-64 SysV ABI 中参数和返回值寄存器的高位是否允许存在垃圾?
x86 64 SysV ABI 指定了函数参数如何在寄存器中传递 第一个参数rdi then rsi等等 以及整数返回值如何传回 在rax进而rdx对于非常大的值 然而 我找不到的是 当传递小于 64 位的类型时 参数或返回值寄存器的高位应
Linux
x86
x8664
callingconvention
根据AMD64 ABI,什么样的C11数据类型是数组
我正在研究 OSX 上使用的 x86 64 的调用约定 并正在阅读 聚合和联合 部分System V x86 64 ABI 标准 http www x86 64 org documentation abi pdf 它提到了数组 我认为这就像
c
Assembly
types
x8664
callingconvention
vararg 函数如何找出机器代码中的参数数量?
可变参数函数如何printf找出他们得到的论点数量 参数的数量显然没有作为 隐藏 参数传递 请参阅在这里调用 asm 示例中的 printf http www cs umbc edu portal help nasm sample shtm
Assembly
printf
callingconvention
ABI
variadic
为什么 C++ 函数中默认参数要放在最后?
为什么 C 函数中默认参数要放在最后 简化语言定义并保持代码可读性 void foo int x 2 int y 要调用它并利用默认值 您需要如下语法 foo 3 这可能是觉得太奇怪了 另一种选择是在参数列表中指定名称 foo y 3 必须
c
function
default
callingconvention
为什么gcc使用movl而不是push来传递函数参数?
注意这段代码 include
c
gcc
Assembly
callstack
callingconvention
为什么即使回调参数与 XML 中的参数不匹配,GObject 方法仍然会被调用?
假设我有这样的方法
c
Linux
glib
dbus
callingconvention
为什么 T* 可以在寄存器中传递,但 unique_ptr
却不能?
我正在观看 Chandler Carruth 在 CppCon 2019 上的演讲 不存在零成本抽象 在其中 他举了一个例子 说明他对使用std unique ptr
c
Assembly
uniqueptr
callingconvention
ABI
汇编将指针传递给函数
我正在尝试将 DWORD 变量作为指针参数发送到函数中 variable1 dd 1 push variable1 push variable adress call InitPoiner InitPoiner push ebp mov e
Assembly
x86
libc
callingconvention
fasm
该程序中的堆栈指针如何通过 call 和 ret 更改
我的问题涉及当上下文发生变化时 尤其是关于RSP and RBP 鉴于这个非常简单的程序 Reading symbols from function call done gdb disass main Dump of assembler c
Assembly
x86
callingconvention
NASM 我应该在调用函数后弹出函数参数吗?
假设我有一个像这样的 nasm 函数 inc mov rax rsp 8 add rax BYTE 1 ret 我这样调用这个函数 push some var call inc 我想通过堆栈将参数传递给函数 所以我推送some var然后调
Assembly
x8664
nasm
callstack
callingconvention
i386 和 x86-64 上的 UNIX 和 Linux 系统调用(和用户空间函数)的调用约定是什么
以下链接解释了 UNIX BSD 风格 和 Linux 的 x86 32 系统调用约定 http www int80h org bsdasm system calls http www freebsd org doc en books de
Linux
Assembly
x8664
callingconvention
ABI
使用带参数的函数时 ebp 和 esp 在堆栈中的行为
我想了解更多关于堆栈的知识 特别是 当调用带有参数的函数时会发生什么 为此 我编写了以下代码 include
Assembly
parameters
x86
stack
callingconvention
为什么 strlen 的 REPNE SCASB 实现可以工作?
为什么这段代码有效 http www int80h org strlen 表示字符串地址必须位于EDI为 注册scasb工作 但这个汇编功能似乎并没有做到这一点 汇编代码为mystrlen global mystrlen mystrlen
c
Assembly
x8664
callingconvention
strlen
为什么不将函数参数存储在 XMM 向量寄存器中?
我目前正在阅读一本书 计算机系统 程序员的视角 我发现 在 x86 64 架构上 我们仅限于 6 个整数参数 这些参数将传递给寄存器中的函数 接下来的参数将在堆栈上传递 此外 前最多 8 个 FP 或向量参数在 xmm0 7 中传递 为什么
Assembly
x86
parameterpassing
x8664
callingconvention
为什么 Mac ABI 要求 x86-32 进行 16 字节堆栈对齐?
我可以理解旧的 PPC RISC 系统甚至 x86 64 的这种要求 但是对于旧的久经考验的 x86 呢 在这种情况下 堆栈只需在 4 字节边界上对齐 是的 一些 MMX SSE 指令需要 16 字节对齐 但如果这是被调用方的要求 那么它应
MacOS
memoryalignment
callstack
callingconvention
ABI
«
1
2
3
»