x86-64是Intel x86架构的64位扩展
我偶然发现了一个失败的单元测试,其中涉及将双精度数转换为整数。 实际转换的数字是 1.234 * 1000.,代码基本上可以归结为: #包括 我偶然发现了一个失败的单元测试,其中涉及将双精度数转换为整数。 实际转换的数字是1.234 * 1000.,代码基本上可以归结为: #include <stdio.h> #include <stdint.h> int64_t deltatime(double numSeconds) { return (int64_t) (numSeconds * 1000.0); } int main() { double s = 1.234; int64_t ms = deltatime(s); printf("%fs -> %dms\n", s, ms); return 0; } 现在为 x86-64 编译这个,给我: $ gcc test.c && ./test 1.234000s -> 1234ms 针对 x86-32 编译它,给我: $ gcc -m32 test.c && ./test 1.234000s -> 1233ms (这是与 $ gcc --version gcc (Debian 14.2.0-7) 14.2.0 ) 现在,我明白数字1.234无法在IEEE-754中精确表示, 例如在单精度浮点数中,它确实是 1.2339999675750732421875,同样,在双精度浮点数中,它是 1.2339999999999999857891452848。 现在,将实际值乘以1000.0(可以精确表示),应该总是给我1233.9999...,并将其转换为int64_t实际上会是1233(而不是天真的预期的1234) . 但是为什么我在 x86-64 上得到 1234(没有为编译器指定任何舍入选项)? 正确的解决方案是否只是将 0.5 添加到总和中(before 转换为 int64_t)? int64_t deltatime(double numSeconds) { return (int64_t) (numSeconds * 1000.0 + 0.5); } 自 C++11 起,您可以 #include <cmath> 并使用 std::llround()。
我在我的树莓派上编译了一个 aarch64 elf 可执行文件: $ 文件 kbgen.elf.aarch64 kbgen.elf.aarch64:ELF 64 位 LSB 可执行文件,ARM aarch64,版本 1 (SYSV),动态链接,解释器 /...
x86-64 在线汇编,使用 IDE,例如 https://www.mycompiler.io/new/asm-x86_64
任何人都可以帮我编写与下面的程序等效的代码,以便它可以在 https://www.mycompiler.io/new/asm-x86_64 的在线 IDE 上运行吗? 我是一名老师,想向我的学生展示如此真实的工作
我正在阅读 Jo Van Hoey 所著的 2019 年书籍《开始 x64 汇编编程:从新手到 AVX 专业人士》的章节末尾…… 这是摘录(跳到 p 的粗体文本...
模拟 AVX512 VPCOMPRESSB 字节打包,无需 AVX512_VBMI2
我已经用 0-63 的字节整数数组填充了 zmm 寄存器。 这些数字充当矩阵的索引。 非零元素表示矩阵中包含数据的行。 并非所有行
如果我们看一下一些现代调用约定,例如 x86-64 SysV 风格或 AArch64 风格(标题为“Arm® 64 位架构的过程调用标准”的 aapcs64.pdf 文档),我们会看到 ex...
模拟 AVX512 VPCOMPESSB 字节打包,无需 AVX512_VBMI2
我已经用 0-63 的字节整数数组填充了 zmm 寄存器。 这些数字充当矩阵的索引。 非零元素表示矩阵中包含数据的行。 并非所有行
我正在编写的软件将在 x86 和 x86-64 架构上的 Windows、Mac 和 Linux 系统中广泛部署。 每当我在 Mac 和 Linux 系统上设置 go 编译器时,我...
在实现使用 GRUB2 启动的 multiboot2 投诉操作系统时,阅读提供的标签,我收到的 type = 25 以及我对 type = 6 的信息请求被忽略。 不完全是...
为什么 GCC 不能为两个 int32 的结构生成最佳运算符 == ?
一位同事向我展示了我认为没有必要的代码,但果然是这样。我希望大多数编译器会将所有这三种相等测试尝试视为等效: #包括...
如何在Linux和x86上重新映射PCIe Bar地址以及配置空间如何分配MMIO?
我对 x86 上的 Linux 中的 PCIe 子系统的详细工作原理存有疑问。 据我所知,要仅使用 mmio 与 PCIe 设备通信,需要执行以下操作: PCIe 配置空间...
设置 IDT 然后启用 STI 后出现一般保护故障 [已解决]
我是操作系统开发新手,想为我的爱好操作系统添加 IDT。启用 STI 后,我立即收到 GPF。现在我的 ISR 确实正确接收中断,但我不知道问题是什么。我有一个 6...
我是操作系统开发新手,想将 IDT 添加到我的爱好操作系统中。启用 STI 后,我立即收到 GPF。现在我的 ISR 确实正确接收中断,但我不知道问题出在哪里。我有一个 6...
为什么在GDB中将eax设置为1后,rax是0xffffffff00000001而不是0x0000000000000001?
我正在 x86-64 系统上使用 GDB 调试 GAS 汇编程序。当我将rax寄存器设置为-1,然后将eax设置为1时,rax的值变为0xffffffff00000001,但我期望它是
我对汇编非常陌生,所以我不知道这是否是一个愚蠢的问题,但我有一个问题,要求我阅读以下汇编行并说出 %rdi 中存储的值之后...
用户模式 x64 中是否有任何方案可以让硬件自动对每个内存加载和存储应用边界检查,而无需编译器的显式检测?我也不想...
考虑以下由 clang 生成的 x64 代码: mov rax, qword ptr [rsi] ; 1 mov rdx, qword ptr [rip + hash_mult] ; 1 imul rdx,qword pt...
x86-64 上的 C++:结构/类何时在寄存器中传递和返回?
假设 Linux 上的 x86-64 ABI,在 C++ 中的什么条件下,结构体会传递给寄存器中的函数,还是传递给堆栈上的函数?在什么条件下它们会返回到寄存器中?答案是吗
编写汇编程序:处理 x64 REX 和 VEX 编码的干净高效的方法?
我正在开发一个 x64 汇编器(只有 64 位,至少现在是这样),而且我已经取得了相当大的进展(我支持几乎所有指令,包括大多数扩展),但我有一些相当...
我们正在使用 Windows 和 Mac M1 机器使用 Docker 进行本地开发,并且需要在我们的 docker 环境中获取并安装 .deb 包。 该软件包需要 amd64/arm64,具体取决于...