x86-64相关内容

新的 X86_64 处理器寄存器的名称是什么?

在哪里可以找到该架构上用于汇编的新寄存器的名称? 我指的是 X86 中的寄存器,如 EAX、ESP、EBX 等.但我希望它们是 64 位的. 我认为它们与反汇编 C 代码时不同,我得到的是 r 而不是 e. 解决方案 旧的 32 位寄存器已经扩展到 64 位,r 寄存器 (rax,rbx、rsp 等等). 此外,还有一些额外的通用寄存器 r8 到 r15 也可以作为(例如 ..
发布时间:2021-12-18 09:07:00 其他开发

"rep;" 是什么意思?不;"在 x86 汇编中是什么意思?和“暂停"一样吗?操作说明?

什么是rep;nop 是什么意思? 和pause指令一样吗? 它是否与 rep nop 相同(没有分号)? 与简单的 nop 指令有何不同? 它在 AMD 和 Intel 处理器上的表现是否不同? (额外奖励)这些说明的官方文档在哪里? 这个问题的动机 在的评论中进行了一些讨论后另一个问题,我意识到我不知道什么rep;nop; 表示在 x86(或 x86-64)程序集中.而且 ..
发布时间:2021-12-18 09:06:31 其他开发

x86_64 汇编器中 RBP 寄存器的用途是什么?

所以我正在尝试学习一些汇编,因为我需要它用于计算机体系结构课程.我写了一些程序,比如打印斐波那契数列. 我认识到,每当我编写一个函数时,我都会使用这 3 行代码(正如我从 gcc 生成的汇编代码与其等效的 C 比较中学到的那样): pushq %rbpmovq %rsp, %rbpsubq 16 美元,%rsp 我有两个问题: 首先,为什么我需要使用%rbp?使用 %rsp 不是更 ..
发布时间:2021-12-18 09:06:05 其他开发

x86_64 寄存器 rax/eax/ax/al 覆盖全部寄存器内容

正如广泛宣传的那样,现代 x86_64 处理器具有 64 位寄存器,可以以向后兼容的方式用作 32 位寄存器、16 位寄存器甚至 8 位寄存器,例如: 0x1122334455667788================ rax(64 位)======== eax (32 位)==== 斧头(16 位)==啊(8位)== al(8 位) 这样的方案可以从字面上理解,即人们总是只能使用指定的名称 ..
发布时间:2021-12-18 09:05:55 其他开发

编译器使用局部变量而不调整 RSP

有问题的编译器:了解从小程序编译器使用两个局部变量,不调整栈指针. 不调整RSP以使用局部变量似乎中断安全,因此编译器似乎依赖硬件在发生中断时自动切换到系统堆栈.否则,出现的第一个中断会将指令指针压入堆栈并覆盖局部变量. 那个问题的代码是: #include int main(){for(int i=0;i 那个编译器生成的汇编代码是: 00000000004004d6 :400 ..
发布时间:2021-12-18 09:04:50 服务器开发

x86-64 上的 C++:何时在寄存器中传递和返回结构/类?

假设 Linux 上的 x86-64 ABI,在 C++ 中,在什么条件下,结构会传递给寄存器中的函数还是堆栈中的函数?在什么条件下它们会在寄存器中返回?课程的答案会改变吗? 如果它有助于简化答案,您可以假设一个参数/返回值并且没有浮点值. 解决方案 定义了 ABI 规范 此处. 此处提供了较新的版本. 我假设读者已经习惯了文档的术语并且他们可以对原始类型进行分类. 如 ..
发布时间:2021-12-18 09:04:18 C/C++开发

“mov offset(%rip), %rax"是什么意思?做?

rax 是得到偏移量加上这条指令的地址,还是下一条?从微码的角度来看,如果答案是下一条指令可能会更容易. 解决方案 下一个.这是 x86 上的一般规则(另见分支). 在英特尔手册第 2 卷第 2.2.1.6 节 RIP 相对寻址中: 一种新的寻址形式,RIP-relative(相对指令指针)寻址,是在 64 位模式下实现的.下一条指令的 64 位 RIP 加上位移形成有效地址. ..
发布时间:2021-12-18 09:04:01 其他开发

将 GNU 中的内存与常量区分为 .intel_syntax

我有一条用 Intel 语法编写的指令(使用 gas 作为我的汇编程序),如下所示: mov rdx, msg_size...msg: .ascii "你好,世界!\n".set msg_size, .- 味精 但是那条 mov 指令正在被组装成 mov 0xe,%rdx,而不是我所期望的 mov $0xe,%rdx.我应该如何编写第一条指令(或 msg_size 的定义)以获得预期的行为? ..
发布时间:2021-12-18 09:00:38 其他开发

x86-64 程序集的性能优化 - 对齐和分支预测

我目前正在编写一些 C99 标准库字符串函数的高度优化版本,例如 strlen()、memset() 等,使用 x86-64 汇编和SSE-2 说明. 到目前为止,我已经设法在性能方面取得了出色的结果,但是当我尝试进行更多优化时,有时会出现奇怪的行为. 例如,添加甚至删除一些简单的指令,或者简单地重新组织一些与跳转一起使用的局部标签,都会完全降低整体性能.并且在代码方面绝对没有理由. ..
发布时间:2021-12-18 08:59:42 其他开发

Visual Studio 中的外部程序集文件

我搜索并发现我无法在 Visual Studio 的 x64 中使用 __asm.相反,我必须使用外部程序集文件. 如何将外部程序集文件添加到我的 win32 控制台项目中? 如何编译它们? 你能不能一步一步地解释一下. 解决方案 如何在 Visual Studio 中使用 x64 程序集文件构建混合源 x64 项目: 1) 启动 Visual Studio (Co ..
发布时间:2021-12-18 08:59:31 其他开发

CS:APP 示例使用带有两个操作数的 idivq?

我正在通过“计算机系统从程序员的角度"(第 3 版)一书阅读有关 x86-64(以及一般的汇编)的信息.根据网络上的其他来源,作者指出 idivq 只接受一个操作数 - 就像 this 声称.但是,作者在几章之后给出了一个示例,指令为 idivq $9, %rcx. 两个操作数?我一开始以为这是一个错误,但从那里开始在书中发生了很多. 此外,应根据寄存器 %rdx(高 64 位)和 % ..
发布时间:2021-12-18 08:58:48 其他开发

x64 指令编码和 ModRM 字节

编码 调用 qword ptr [rax]调用 qword ptr [rcx] 是 FF 10FF 11 我可以看到最后一位数字 (0/1) 的来源(注册号),但我想弄清楚倒数第二位数字 (1) 的来源.根据AMD64 架构程序员手册第 3 卷:通用和系统说明第 56 页, "/digit - 表示 ModRM 字节仅指定一个寄存器或内存 (r/m) 操作数.该数字由 ModRM r ..
发布时间:2021-12-18 08:58:41 其他开发

如何在 NASM 中推送 64 位 int?

我正在尝试推送一个 64 位整数,但在组装 NASM 时似乎希望将其视为 DWORD 而不是 QWORD. 我正在使用 ASM 创建 shellcode 我需要将 64 位 DLL 注入 64 位进程.第一个 QWORD 是旧指令指针,第二个是包含 DLL 地址的地址,第三个是 LoadLibrary 的地址.占位符在运行时填充. section .text全局_start_开始:位 64 ..
发布时间:2021-12-18 08:57:33 其他开发

为什么我们不能将 64 位立即数移动到内存中?

首先我对 movq 和 movabsq 之间的区别有点困惑,我的教科书说: 常规 movq 指令只能具有可以表示为 32 位二进制补码的直接源操作数.然后对该值进行符号扩展以生成目标的 64 位值.movabsq 指令可以将任意 64 位立即数作为其源操作数,并且只能将寄存器作为目标. 我有两个问题. 问题 1 movq 指令只能有可以表示为 32 位二进制补码的立即数源操 ..

x64 程序集中的“阴影空间"是什么?

我找到了很多关于这个影子空间的话题,但我都找不到答案,所以我的问题是: 在进入过程之前,我需要从堆栈指针中减去多少字节? 在减去“阴影空间"之前,我应该将过程参数压入堆栈吗? 我已经反汇编了我的代码,但我找不到逻辑. 解决方案 阴影空间(有时也称为溢出空间或家庭空间) 位于被调用函数拥有的返回地址上方 32 个字节(并且可以用作暂存空间),低于堆栈参数(如果有).调用者必 ..
发布时间:2021-12-18 08:55:50 其他开发

为什么(或不是?)SFENCE + LFENCE 等价于 MFENCE?

正如我们从之前对 在 x86/x86_64 处理器中指令 LFENCE 有意义吗?我们不能使用 SFENCE 代替 MFENCE 来实现顺序一致性. 那里的答案表明 MFENCE = SFENCE+LFENCE,即 LFENCE 做了一些我们没有的事情不能提供顺序一致性. LFENCE 无法重新排序: SFENCELFENCEMOV 注册,[地址] -- 至 --> MOV re ..
发布时间:2021-12-18 08:52:35 其他开发

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

根据 x64 中的 Intel,以下寄存器称为通用寄存器(RAX、RBX、RCX、RDX、RBP、RSI、RDI、RSP 和 R8-R15)https://software.intel.com/en-us/articles/introduction-to-x64-assembly. 在下面的文章中,写到 RBP 和 RSP 是专用寄存器(RBP 指向当前堆栈帧的底部,RSP 指向当前堆栈帧的 ..
发布时间:2021-12-18 08:52:10 其他开发