标签: x86-64

在C中将32位应用程序转换为64位应用程序

我目前正致力于将32位应用程序转换为C语言中的64位应用程序.此应用程序目前正在开发x86架构(Windows,osx,Unix,Linux).因此,在开始编码之前,我想知道在转换应用程序时我需要考虑什么.

c x86 x86-64

20
推荐指数
4
解决办法
4万
查看次数

x86_64 va_list结构的格式是什么?

任何人都有参考va_listx86_64 ABI(在Linux上使用的那个)的表示?我正在尝试调试一些代码,其中堆栈或参数似乎已损坏,这将真正有助于理解我应该看到的内容......

c linux x86-64 abi variadic-functions

20
推荐指数
2
解决办法
1万
查看次数

免费的64位反汇编程序?

有没有免费的AMD64反汇编程序?

好像有很多x86反汇编程序,但它们无法打开64位文件......

更新:

是否有任何工具可以在反汇编中显示导出的符号?在未确定导出时,有点难以找出代码.(我不需要调试符号,只需要导出.)

windows 64-bit x86-64 disassembly

20
推荐指数
4
解决办法
3万
查看次数

为什么x86的INC指令不是原子的?

我已经读过x86的INC指令不是原子的.我的问题是怎么来的?假设我们在x86-64上递增64位整数,我们可以用一条指令来完成,因为INC指令适用于内存变量和寄存器.那么为什么它不是原子的呢?

c assembly x86-64 atomic

20
推荐指数
2
解决办法
7533
查看次数

R代表RAX,RBX,RCX,RDX,RSI,RDI,RBP,RSP?

x86汇编语言不得不改变,因为x86处理器架构已经从8位变为16位变为32位,现在变为64位.

我知道在32位汇编程序寄存器名称(EAX,EBX等)中,每个名称的E前缀代表扩展意味着32位形式的寄存器而不是16位形式(AX,BX等).

这些寄存器名称的R前缀在64位中代表什么?

x86 assembly x86-64 cpu-architecture cpu-registers

20
推荐指数
2
解决办法
2万
查看次数

长多字节NOP:通常理解的宏或其他符号

x86(和x86_64)处理器不仅具有单字节NOP指令,而且还具有各种类型的多字节NOP类指令,这不是一个大秘密.

我找到了那些:

AMD推荐,参考.用于AMD系列15h处理器的AMD软件优化指南,文档#47414,第5.8节"带操作数大小覆盖和多字节NOP的代码填充",第94页)

90                              NOP1_OVERRIDE_NOP
6690                            NOP2_OVERRIDE_NOP
0f1f00                          NOP3_OVERRIDE_NOP
0f1f4000                        NOP4_OVERRIDE_NOP
0f1f440000                      NOP5_OVERRIDE_NOP
660f1f440000                    NOP6_OVERRIDE_NOP
0f1f8000000000                  NOP7_OVERRIDE_NOP
0f1f840000000000                NOP8_OVERRIDE_NOP
660f1f840000000000              NOP9_OVERRIDE_NOP
66660f1f840000000000            NOP10_OVERRIDE_NOP
6666660f1f840000000000          NOP11_OVERRIDE_NOP
Run Code Online (Sandbox Code Playgroud)

英特尔推荐,参考.英特尔64和IA-32架构软件开发人员手册卷2B:指令集参考,新西兰,"NOP"部分

90                              NOP
6690                            66 NOP
0f1f00                          NOP DWORD ptr [EAX]
0f1f4000                        NOP DWORD ptr [EAX + 00H]
0f1f440000                      NOP DWORD ptr [EAX + EAX*1 + 00H]
660f1f440000                    66 NOP DWORD ptr [EAX + EAX*1 + 00H]
0f1f8000000000                  NOP DWORD ptr [EAX + 00000000H]
0f1f840000000000                NOP DWORD ptr [EAX …
Run Code Online (Sandbox Code Playgroud)

x86 assembly x86-64 disassembly nop

20
推荐指数
1
解决办法
3804
查看次数

为什么iOS模拟器需要i386和x86_64符号,即使我只在x86_64系统上?

我正试图让一个在模拟器上运行的应用程序之前遇到了一些问题.我们没有为其构建libjpeg.a i386,但确实有x86_64.这是唯一的依赖,但我想知道为什么我真的需要i386符号,如果我在x86_64mac 上运行.

x86-64 i386 ios-simulator

20
推荐指数
4
解决办法
2万
查看次数

在int和double之间转换有多贵?

我经常看到代码将int转换为双精度转换为双精度并再次转换(有时候出于好的理由,有时候没有),而且我刚刚想到这似乎是我程序中的"隐藏"成本.我们假设转换方法是截断.

那么,它有多贵?我确定它会因硬件而异,所以让我们假设一个新的英特尔处理器(Haswell,如果你愿意,虽然我会采取任何措施).我会感兴趣的一些指标(虽然一个好的答案不需要全部):

  1. 生成的指令数
  2. 使用的周期数
  3. 与基本算术运算相比的相对成本

我还假设我们最敏锐地体验慢转换的影响的方式是关于功率使用而不是执行速度,因为我们每秒可以执行多少次计算相对于实际到达的数据量的差异在每秒CPU.

c++ x86 c++-cli x86-64 micro-optimization

20
推荐指数
2
解决办法
6558
查看次数

为什么rbp和rsp称为通用寄存器?

根据英特尔在x64中,以下寄存器称为通用寄存器(RAX,RBX,RCX,RDX,RBP,RSI,RDI,RSP和R8-R15)https://software.intel.com/en-us/articles/介绍到x64组装.

在下面的文章中,写了RBP和RSP是专用寄存器(RBP指向当前堆栈帧的基础,RSP指向当前堆栈帧的顶部). https://www.recurse.com/blog/7-understanding-c-by-learning-assembly

现在我有两个相互矛盾的陈述.英特尔声明应该是值得信赖的,但是什么是正确的,为什么RBP和RSP被称为通用目的?

谢谢你的帮助.

assembly x86-64 cpu-registers

20
推荐指数
2
解决办法
2万
查看次数

x86-64上的红色区域究竟在哪里?

来自维基百科:

在计算中,红色区域是函数堆栈帧中超出返回地址的固定大小区域,该区域不被该函数保留.被调用函数可以使用红色区域来存储局部变量,而无需修改堆栈指针的额外开销.中断/异常/信号处理程序不会修改此内存区域.System V使用的x86-64 ABI要求一个128字节的红色区域,它直接在返回地址之后开始并包含函数的参数.OpenRISC工具链假设一个128字节的红色区域.

System V x86-64 ABI:

超出%rsp指向的位置的128字节区域被认为是保留的,不应被信号或中断处理程序修改.因此,函数可以将此区域用于函数调用不需要的临时数据.特别是,叶子函数可以将这个区域用于它们的整个堆栈帧,而不是调整序言和尾声中的堆栈指针.这个区域被称为红区.

  • 鉴于这两个引号,堆叠的返回地址上方或堆叠的返回地址下方红色区域 是?

  • 由于这个红色区域是相对的RSP,它是否向下push移动并且每个区域向上移动pop

assembly x86-64 abi calling-convention red-zone

20
推荐指数
2
解决办法
2331
查看次数