x86-64相关内容

NASM:在运行时从RIP(指令指针)获取重新定位的二进制的偏移量

我有一个适用于x86_64的兼容Multiboot2的ELF文件,其中开始符号在start.asm中定义,这是一个NASM程序集文件。Multiboot2标头包含relocatable标记。 由于GRUB不支持Multiboot2+a可重定位ELF(至少在2021年7月[3]),我希望自己解决一些重定位问题以解决此问题,并只加载静态ELF。 为此,我需要在运行时在我的第一个条目符号(在EL ..
发布时间:2022-04-06 11:10:48 其他开发

Yasm:vmovaps指令导致分段错误

问题:movaps出现分段错误。 上下文:x86-64指令vmovaps旨在与Core I系列处理器(我正在运行此系统)上的AVX寄存器一起使用。AVX寄存器的宽度是SSE寄存器的两倍(分别为256位和128位)。指令vmovaps应将对齐的浮点值(32位)向量移入指定的ymm寄存器。 可能的原因:源数据的对齐特别重要,因为不正确对齐的数据是分段错误的来源。然而,即使我已经对齐了我的数 ..
发布时间:2022-04-06 11:09:13 其他开发

使用NASM__?浮点宏

NASM手册谈到了这些宏,但就我所见,它并没有真正解释如何使用它们。Section 3.4.6状态: 浮点常量仅可作为DW、DD、DQ、DT和DO的参数,或作为特殊运算符__?float16?__、__?bfloat16?__、__?float32?__、__?float64?__、__?float80m?__、__?float80e?__、__?float128l?__的参数,和__?fl ..
发布时间:2022-04-06 11:02:14 其他开发

Linux x86_64汇编套接字编程

大家好。 所以我正在学习汇编语言。 按照我通常学习的任何新语言的学习步骤,我已经达到了与汇编语言联网的地步。 遗憾的是,这不是很顺利,因为我在步骤0几乎失败了,这将是获得一个套接字,通过它可以开始通信。 汇编代码应大致等于以下C代码: #include #include int main(){ int s ..
发布时间:2022-03-21 21:48:42 服务器开发

NASM printf打印64位双段错误

我正努力想办法在装配中打印双面纸,但我失败得很惨。在调用我自己的函数时,我得到了Segerror,我计划使用该函数作为帮助器来打印双精度值以进行调试。我遵循了这些printf示例:https://www.csee.umbc.edu/portal/help/nasm/sample.shtml 我的代码当前如下所示: section .data formatStrf: db `Th ..
发布时间:2022-02-23 21:05:36 其他开发

gcc中有128位整数吗?

我想要一个 128 位整数,因为我想存储两个 64 位数字相乘的结果.gcc 4.4 及更高版本中有这样的东西吗? 解决方案 128 位整数类型仅在 64 位目标上可用,因此即使您需要检查可用性已经检测到最近的 GCC 版本.理论上 gcc 可以在需要 4 个 32 位寄存器来保存一个的机器上支持 TImode 整数,但我认为在任何情况下都不会. GCC 4.6 及更高版本将 __i ..
发布时间:2022-01-31 10:24:22 其他开发

嵌入汇编程序以在可移植 C++ 中操作 64 位寄存器

我有一个简单(但性能关键)的 C (嵌入在 C++ 中)算法来操作数据缓冲区......该算法“自然"使用 64 位大端寄存器值 - 我想优化这使用汇编程序来直接访问进位标志和 BSWAP,因此避免了一次操作一个字节的 64 位值. 我希望解决方案能够在操作系统/编译器之间移植——最低限度地支持 GNU g++ 和 Visual C++——以及分别在 Linux 和 Windows 之间移植 ..
发布时间:2022-01-23 20:34:42 C/C++开发

x86_64 对齐堆栈并在不保存寄存器的情况下恢复

我正在为 x86_64 编写中断处理例程.ABI 规定,在调用 C 函数之前,我必须将堆栈对齐到 16 个字节.x86_64 ISA 指定在进入 ISR 时,我的堆栈是 8 字节对齐的.因此,我需要将堆栈指针对齐到 16 个字节.问题是从我的 C 函数返回时,我必须恢复(可能)未对齐的堆栈指针,以便我可以正确地从中断中返回. 我想知道是否有办法在不使用通用寄存器的情况下做到这一点? 解 ..
发布时间:2022-01-22 12:52:27 其他开发

少于四个参数的函数是否需要保留堆栈空间?

刚开始学习 x64 汇编,我有一个关于函数、参数和堆栈的问题.据我了解,函数中的前四个参数被传递给 Windows 中的 rcx、rdx、r8 和 r9 寄存器(以及用于浮点数的 xmm0-xmm3).所以一个简单的有四个参数的加法函数看起来像这样: 添加:mov r10, rcx添加 r10, rdx添加 r10, r8添加 r10, r9mov rax, r10ret 但是,我遇到了 文档 ..
发布时间:2022-01-22 12:17:38 其他开发

在 64 位 Linux 上使用中断 0x80

我有一个简单的 64 位汇编程序,旨在打印一个 'O' 和 'K' 后跟一个换行符. 但是,“K"永远不会被打印出来.程序的目标之一是将 rax 寄存器的低位中的值打印为 ASCII 字母.该程序专为 64 位 Linux 编写,用于教育目的,因此无需使用 C 风格的系统调用. 我怀疑问题出在 mov QWORD [rsp], rax 或 mov rcx, rsp. 目前,程序仅 ..
发布时间:2022-01-22 12:13:10 服务器开发

x86_64 - 程序集 - 循环条件和乱序

我不要求一个基准. (如果是这样,我会自己做的.) 我的问题: 为了方便,我倾向于避免使用间接/索引寻址模式. 作为替代,我经常使用立即、绝对或寄存器寻址. 代码: ;%esi 有数组地址.假设我们迭代一个双字(4 字节)数组.;%ecx 是数组元素计数(0x98767) 循环:... ; 用 %esi 做任何事添加 $4, %esidec %ecxjnz 0x98 ..
发布时间:2022-01-20 23:09:28 其他开发

“mov rax, QWORD PTR fs:0x28"是什么意思?汇编指令做什么?

在这条指令执行之前,fs包含0x0. 另外我想知道如何从 GDB 中的这个内存区域读取,该命令是什么? 解决方案 Linux 和 Windows 等现代操作系统中的 fs 和 gs 寄存器指向线程特定和其他操作系统定义的结构.修改段寄存器是受保护的指令,所以只有操作系统可以为你设置这些. 这个问题应该有助于解释究竟是什么意思:amd64 fs/gs registers inli ..
发布时间:2022-01-20 20:49:09 服务器开发