x86-64是Intel x86架构的64位扩展
我制作了一个 nasm 程序集 hello world 程序,如下所示: 全局启动 节.文本 开始: 莫夫拉克斯,0x20000004 莫夫RDI,1 lea rsi,[相关消息] mov rdx, msg.len 系统调用 我...
__builtin_sinf 它是什么?它在哪里?我如何获得它的反汇编?
今天早上我很好奇,想看看我是否可以获取并理解为计算诸如 sin 之类的数学函数而生成的机器指令,据我所知,没有 mac...
我的编译器正在编写 DWARF DIE,我目前遇到跟踪变量的问题。 例如,缩写看起来像: DW_AT_名称 DW_FORM_字符串
为什么我在反汇编输出中看到条件跳转到相对偏移量零(也称为跳转到下一条指令)?
背景:我知道——或者至少知道——这个问题的答案;我将其发布在这里是因为几个小时前,当我没有这样做时,我无法通过搜索这些关键字找到任何内容。 有时...
了解内存控制器 RPQ/WPQ 加载和 ntstore 的排序保证
我试图了解当 RPQ 之间存在显着的队列压力差异时,内存控制器如何维护非临时加载和非临时存储之间的程序顺序(读取待处理...
我在测试时运行 test i gdb 以利用缓冲区溢出: (gdb) r $(python3 -c 'print(b"\x41"*152+"\x42"*6 )') (gdb)我 ... rbp 0x4141414141414141
在 MUSL 的 x86_64 __syscall_cp_asm 包装器中的系统调用之前将传入的 pthread 地址保存在堆栈上的目的?
这是来自musl的源代码: 1 __syscall_cp_asm: 2 __cp_开始: 3 移动 (%rdi),%eax 4 测试%eax,%eax 5 jnz __cp_cancel 6 移动 %rdi,%r11 7 移动 %rsi,%rax 8 m...
了解 Clang 的 SIMD 优化,用于将 float 乘以 int 循环计数器
给定以下函数 void foo(float* 结果, int 大小, float y, float delta) { 对于 (int t = 0; t < size; ++t) { result[t] = y + delta * t; } } Clang with -O2 generates the
是否可以使 Visual Studio C++ 构建支持 x86 和 x64?
如何让 Visual Studio 2022 C++ 构建一个在 x86 和 x64 平台上运行的 exe 文件? 我看到单独的选项 x86 或 x64,但没有看到类似“AnyCPU”的内容。 我尝试过
考虑这个 TU: 结构体 Foo { int 运算符()(int) const; }; int foo(Foo b) { 返回 b(17); } 它将编译为: 富(富): 子 rsp,24 莫夫ESI,17 莉亚·迪,[rsp+15] 打电话给 Foo::ope...
如何在 Windows 的 x86_64 程序集中使用 printf 和 scanf?
该程序的目标是接收来自用户的 3 个参数和一个附加参数并求其总和。 我让它工作,以便它找到 3 个参数的总和并打印出总和......
在 x86 和 x86_64 上将浮点数截断为 int 具有不同的舍入误差
我偶然发现了一个失败的单元测试,其中涉及将双精度数转换为整数。 实际转换的数字是 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()。
我偶然发现了一个失败的单元测试,其中涉及将双精度数转换为整数。 实际转换的数字是 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()。
我偶然发现了一个失败的单元测试,其中涉及将双精度数转换为整数。 实际转换的数字是 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...