x86 相关问题

x86是一个源自Intel 8086 CPU的架构。 x86系列包括32位IA-32和64位x86-64架构,以及传统的16位架构。关于后者的问题应该标记为[x86-16]和/或[emu8086]。如果您的问题特定于64位x86-64,请使用[x86-64]标记。对于x86 FPU,请使用标记[x87]。对于SSE1 / 2/3/4 / AVX *,也可以使用[sse]和[avx] / [avx2] / [avx512]中的任何一个

为什么这个未初始化的布尔变量总是从0开始?

首先我知道这是UB,从技术上讲任何事情都可能发生。但是关于使用 -O0 为目标 x86_64-linux-gnu 编译的代码片段,为什么它永远不会打印“truthy”...

回答 1 投票 0

传统 x86(Intel-VT 和 AMD-SVM 之前)是否支持 Type 1 Hypervisor?

我熟悉动态转换和陷阱与仿真(Type1 Hypervisor)概念。让我困惑的是,很多文章通常将动态翻译和类型 1 hypervis 结合起来......

回答 1 投票 0

GCC 编译器选项可在 x86 中获取 ES 段覆盖前缀?

我有内存布局(在增加内存地址中),例如: 代码部分(0-4k)、数据部分(4k-8k)、堆栈部分(8k-12k)、自定义数据部分(12k-16k)。 我在 Custom 中放置了一些特殊的数组、结构

回答 2 投票 0

在 x86 中获取 Segment Override 前缀的 GCC 编译器选项是什么

我有内存布局(在增加内存地址中),例如: 代码部分(0-4k)、数据部分(4k-8k)、堆栈部分(8k-12k)、自定义数据部分(12k-16k)。 我在 C 中放置了一些特殊的数组、结构......

回答 2 投票 0

没有硬件支持如何实现机器虚拟化

这是参考机器虚拟化。 我正在经历虚拟化并了解到,通过硬件辅助虚拟化技术,特权指令可以通过...来识别

回答 2 投票 0

状态寄存器会影响CPU中的数据存储吗?

当您在 x86 或 x86_64 中执行算术运算时,例如导致设置溢出标志或任何其他标志,设置的位是否会影响哪个寄存器的结果值...

回答 1 投票 0

在 C 语言中比较 double 与文字值在 32 位机器上会给出不同的结果

有人可以解释一下原因吗: 双 d = 1.0e+300; printf("%d “,d==1.0e+300); 在 64 位机器上按预期打印“1”,但在 32 位机器上打印“0”? (我在 Fedora 25 上使用 GCC 6.3 得到了这个......

回答 1 投票 0

在 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 投票 0

在 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 投票 0

在 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 投票 0

C 运行时是否会在函数调用之前清除 args 的主槽?

当您从 C/C++ 调用函数时,该函数的某些参数小于 64 位,运行时是否会将这些参数的起始位置处的堆栈内存清零?或者每个参数的顶部是否包含

回答 1 投票 0

Autoconf 忽略编译器标志

我正在尝试构建一个具有非本机架构的 C 库。我正在运行 OSX 10.6(即 x86_64),但我需要为 i386 编译的库。通常,您只需添加编译器标志即可:-arch ...

回答 2 投票 0

使用 aarch64-none-elf-gcc 编译时,自定义部分内的结构会反转

当我使用 x86 的 gcc 进行编译时,结构体按照我声明它们的顺序放置在该部分中。但是,当我使用 aarch64-none-elf-gcc 为 ARM 目标进行编译时,结构出现...

回答 1 投票 0

寻址模式[IndexReg * ScaleFactor + Offset]有什么用?

在X86汇编中,什么类型的操作使用这种格式的寻址方式? IndexReg * 比例因子 + 偏移量 mov rax, [r15 * 8 + 56]

回答 1 投票 0

如何在AsmJit中引用extern值

在 AsmJit 中,我怎样才能完成与此程序集相同的操作: 外部 g_value:dword ;... 添加ecx,[g_value] 即引用外部定义的值。

回答 1 投票 0

x86 操作系统中是否指定/限制了页表位置?

我熟悉MIPS架构,它有一个软件管理的TLB。因此,如何以及在何处存储页表和页表条目完全取决于您。例如我做了一个项目

回答 1 投票 0

如何在Assembly 32位中的正确位置正确打印用户输入

我目前正在终端中开发一个简单的“关于我”部分。我正在使用 NASM Assembly 并在 Oracle VM 中运行 Ubuntu。我目前在打印用户输入时遇到问题

回答 1 投票 0

如何为 Go 构建 8g 和 6g Go 编译器

我正在编写的软件将在 x86 和 x86-64 架构上的 Windows、Mac 和 Linux 系统中广泛部署。 每当我在 Mac 和 Linux 系统上设置 go 编译器时,我...

回答 2 投票 0

CPU(如 Intel/AMD/ARM)可以进行除加法/减法/乘法/除法之外的更高数学计算吗?

我学了一些逻辑电路和计算机体系结构,包括汇编指令集(如x86指令集、ARM指令集)和微体系结构(x86/ARM),我发现没有...

回答 2 投票 0

将c代码转换为x86汇编的简单方法?

有没有一种简单的方法(比如免费程序)可以将 c/c++ 代码转换为 x86 程序集? 我知道任何 C 编译器都会做一些非常相似的事情,我可以编译 C 代码然后拒绝......

回答 9 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.