x86-64是Intel x86架构的64位扩展
我正在分析汇编中的嵌套数组访问代码,其中数组包含整数。机器代码计算访问特定子数组的行偏移量。这是我观察到的: ...
如何检测Linux alder Lake系统中的E核和P核?
如何查看特定CPU核心属于P核还是E核组?有没有办法列出正在运行的 Linux x86_64 alder Lake 系统中有关性能/能源核心的信息?就像,打印...
AMD64 系统上的 Pushl %ecx 和 popl %ecx 的等价物是什么,我的结果是错误:“push”的指令后缀无效我已经看过了,有人建议将 ecx 更改为 rcx,但是...
为什么C#的Thread.MemoryBarrier()使用“lock or”而不是mfence?
我正在阅读一些旧的 MS 文档,理论与实践中的 C# 内存模型,第 2 部分,并且有兴趣阅读: 一种可能的修复方法是在 ThreadA 和 Thra 中插入内存屏障...
我正在使用 Visual C++ 2010 和 masm(“快速调用”调用约定)进行一些 x64 汇编。 假设我有一个 C++ 函数: extern "C" void fillArray(unsigned char* byteArray, unsigned char
Python 在 Windows 8.1 64 位上错误地检测到 32 位系统
PS C:\Users\************> C:\Python27\python.exe Win32 上的 Python 2.7.15(v2.7.15:ca079a3ea3,2018 年 4 月 30 日,16:30:26)[MSC v.1500 64 位(AMD64)] 输入“帮助”、“版权”、“制作人员”或“许可证”...
我制作了一个 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()。