abi相关内容
像 printf 这样的可变参数函数如何找出它们得到的参数数量? 参数的数量显然不是作为(隐藏的)参数传递的(参见 在此处的 asm 示例中调用 printf). 有什么诀窍? 解决方案 诀窍在于你以其他方式告诉他们.对于 printf,您必须提供一个格式字符串,其中甚至包含类型信息(尽管这可能不正确).提供此信息的方式主要是用户合同,而且通常容易出错. 至于调用约定:通
..
假设 Linux 上的 x86-64 ABI,在 C++ 中,在什么条件下,结构会传递给寄存器中的函数还是堆栈中的函数?在什么条件下它们会在寄存器中返回?课程的答案会改变吗? 如果它有助于简化答案,您可以假设一个参数/返回值并且没有浮点值. 解决方案 定义了 ABI 规范 此处. 此处提供了较新的版本. 我假设读者已经习惯了文档的术语并且他们可以对原始类型进行分类. 如
..
我找到了很多关于这个影子空间的话题,但我都找不到答案,所以我的问题是: 在进入过程之前,我需要从堆栈指针中减去多少字节? 在减去“阴影空间"之前,我应该将过程参数压入堆栈吗? 我已经反汇编了我的代码,但我找不到逻辑. 解决方案 阴影空间(有时也称为溢出空间或家庭空间) 位于被调用函数拥有的返回地址上方 32 个字节(并且可以用作暂存空间),低于堆栈参数(如果有).调用者必
..
来自维基百科: 在计算中,红色区域是函数堆栈帧中超出返回地址的固定大小区域,该区域未由该函数保留.被调用函数可以使用红色区域来存储局部变量,而无需修改堆栈指针的额外开销.这个内存区域不会被中断/异常/信号处理程序修改.System V 使用的 x86-64 ABI 要求有一个 128 字节的红色区域,该区域直接在返回地址之后开始并包含函数的参数.OpenRISC 工具链假定一个 128 字节
..
我正在研究某个 C++ 库(或更多框架).我想让它倒退与以前的版本兼容,不仅保留了 API 兼容性,还保留了 ABI(就像 Qt 所做的那样出色). 我使用了 Boost 的许多功能,在我看来,这使得向后兼容是不可能的,除非我强迫用户使用完全相同(有时是旧)版本的 Boost. 有没有什么办法(不重写 Boost 的 1/2)在它的命名空间周围做一些“前缀"/重命名它以防止它干扰用户版
..
我可以理解旧 PPC RISC 系统甚至 x86-64 的这种需求,但是旧的久经考验的 x86 呢?在这种情况下,堆栈只需要在 4 字节边界上对齐.是的,一些 MMX/SSE 指令需要 16 字节对齐,但如果这是被调用者的要求,那么它应该确保对齐是正确的.为什么要让每个来电者承担这个额外的要求?这实际上会导致性能下降,因为每个呼叫站点都必须管理此要求.我错过了什么吗? 更新:在对此进行了更多
..
我找不到在 MacOS 上编写 64 位程序集的好文档. 64 位 SysV ABI 在 A 部分中说明了以下内容.2.1 和 这篇SO帖子引用了它: 系统调用是通过 syscall 指令完成的.内核破坏注册 %rcx 和 %r11. 从系统调用返回,寄存器 %rax 包含系统调用.-4095 和 -1 之间的值表示错误,它是 -errno. 这两句话在 Linux 上没问
..
任何人都可以参考 x86_64 ABI(Linux 上使用的 ABI)中 va_list 的表示?我正在尝试调试一些堆栈或参数似乎已损坏的代码,这真的有助于理解我应该看到的内容... 解决方案 x86-64 System V ABi 文档可能会有所帮助.这是一个参考,虽然很轻. 变量参数列表参考从第 54 页开始,然后继续,第 56-57 页文档va_list: va_list
..
来自维基可执行和可链接格式: 段包含文件运行时执行所需的信息,而段包含用于链接和重定位的重要数据.整个文件中的任何字节最多只能由一个节拥有,并且可以存在不为任何节所有的孤立字节. 但是section和segment有什么区别呢?在一个可执行的 ELF 文件中,一个段是否包含一个或多个段? 解决方案 但是section和segment有什么区别? 正是您引用的内容:段包
..
在下面的 C++ 源代码的汇编中.为什么 RAX 被压入堆栈? RAX,正如我从 ABI 理解的那样,它可以包含来自调用函数的任何内容.但是我们将它保存在这里,然后将堆栈向后移动 8 个字节.所以堆栈上的 RAX,我认为只与 std::__throw_bad_function_call() 操作相关......? 代码:- #include void f(std::functiona
..
总结:我正在查看汇编代码来指导我的优化,并在将 int32 添加到指针时看到了很多符号或零扩展. void Test(int *out, int offset){出[偏移] = 1;}-------------------------------------movslq %esi, %rsimovl $1, (%rdi,%rsi,4)退 起初,我认为我的编译器在将 32 位整数添加到 64 位
..
我在理解调用者和被调用者保存的寄存器之间的区别以及何时使用什么时遇到了一些麻烦. 我正在使用 MSP430: 程序: mov.w #0,R7mov.w #0,R6添加.w R6,R7inc.w R6cmp.w R12,R6jl l$循环mov.w R7,R12退 上面的代码是一个被调用者,在教科书的例子中使用过,所以它遵循约定.R6 和 R7 是被调用者保存的,R12 是被调用者保
..
我相信我了解 linux x86-64 ABI 如何使用寄存器和堆栈将参数传递给函数(参见 之前的 ABI 讨论).我感到困惑的是,如果/哪些寄存器应该在函数调用中保留.也就是说,哪些寄存器可以保证不被破坏? 解决方案 这里是完整的寄存器表及其使用文档 [PDF 链接]: r12、r13、r14、r15、rbx、rsp、rbp 是被调用者保存的寄存器 - 它们在“跨函数调用保留"列中
..
x86-64 System V ABI(用于除 Windows 以外的所有设备)过去位于 http://x86-64.org/documentation/abi.pdf,但该网站现已从互联网上撤下. 文档有新的权威主页吗? 解决方案 System V x86-64 psABI 文档作为 LaTeX 源维护 在 GitLab 上.同样,i386 psABI 是一个单独的 GitLab
..
以下链接解释了 UNIX(BSD 风格)和Linux: http://www.int80h.org/bsdasm/#system-calls http://www.freebsd.org/doc/en/books/developers-handbook/x86-system-calls.html 但是 UNIX 和 UNIX 上的 x86-64 系统调用约定是什么?Linux?
..
int 0x80 在 Linux 上总是调用 32 位 ABI,不管它是从什么模式调用的:ebx 中的 args,ecx,...和来自 /usr/include/asm/unistd_32.h 的系统调用号.(或者在没有 CONFIG_IA32_EMULATION 的情况下编译的 64 位内核上崩溃). 64 位代码应该使用 syscall,调用号来自 /usr/include/asm/un
..
X32 允许使用在 x86_64 处理器上运行的 32 位整数、长整数和指针编写程序.在某些用例中,使用 X32 有许多好处.(X32 与 X86 或 X64 不同;有关详细信息,请参阅x86、x32 和 x64 架构之间的区别).> 似乎某些 Windows Enterprise Server 支持 X32,但我无法找到有关它的更多信息.这是基于一些英特尔 PDF,例如 面向智能系统的基于英特
..
请解释x86、x32和x64的区别?当涉及到 x86 和 x32 时,它有点令人困惑,因为大多数时候 32 位程序在 x86 上运行... 解决方案 x86 是指在 PC 中使用的 Intel 处理器架构.型号为 8088(8086 的 8 位总线版本,用于第一台 IBM PC)、8086、286、386、486.之后他们切换到名称而不是数字以阻止 AMD 复制处理器名称.Pentium
..
x86-64 指令集添加了更多寄存器和其他改进,以帮助简化可执行代码.但是,在许多应用程序中,增加的指针大小是一种负担.每个指针中额外的、未使用的字节会阻塞缓存,甚至可能溢出 RAM.例如,GCC 使用 -m32 标志构建,我认为这就是原因. 可以加载 32 位值并将其视为指针.这不需要额外的指令,只需加载/计算 32 位并从结果地址加载.然而,这个技巧不会是可移植的,因为平台有不同的内存映
..
X32 允许使用在 x86_64 处理器上运行的 32 位整数、长整数和指针编写程序.在某些用例中,使用 X32 有许多好处.(X32 与 X86 或 X64 不同;有关详细信息,请参阅x86、x32 和 x64 架构之间的区别).> 似乎某些 Windows Enterprise Server 支持 X32,但我无法找到有关它的更多信息.这是基于一些英特尔 PDF,例如 面向智能系统的基于英特
..