x86相关内容

现代处理器中是否有对 128 位整数的硬件支持?

我们是否仍然需要在软件中模拟 128 位整数,或者现在您的普通桌面处理器是否有硬件支持? 解决方案 我将通过将台式处理器与简单的微控制器进行比较来解释它,因为算术逻辑单元 (ALU) 的操作类似,它们是计算器在 CPU 中,Microsoft x64 调用约定 vs ..
发布时间:2022-01-06 13:04:57 其他开发

如何强制cpu核心刷新c中的存储缓冲区?

我有一个应用程序,它有 2 个线程,线程 A 与核心 1 的关联性和线程 B 与核心 2 的关联性,核心 1 和核心 2 在同一个 x86 插槽中. 线程 A 对整数 x 进行忙自旋,线程 B 在某些条件下会增加 x,当线程 B 决定增加 x 时,它会使 x 所在的缓存行无效,并根据 x86 MESI 协议存储新的 x在 core2 接收到 invalidate ack 之前存储缓冲区,然后 ..
发布时间:2022-01-06 13:04:38 其他开发

为什么在重复调用 clock_gettime 时会看到 400x 异常值计时?

我正在尝试使用物理时钟来测量 C++ 中某些命令的执行时间,但是我遇到了一个问题,即从计算机上的物理时钟读取测量值的过程可能需要很长时间.代码如下: #include #include #include #include #include int main(){int64_t mtime、mtime2、m_TSsum、m_TSssum、m_TSnum、m_TSmax;结构时间规格 ..
发布时间:2022-01-06 13:04:18 服务器开发

SSE2 内在函数 - 比较无符号整数

我有兴趣在添加无符号 8 位整数时识别溢出值,并将结果限制为 0xFF: __m128i m1 = _mm_loadu_si128(/* 16 个 8 位无符号整数 */);__m128i m2 = _mm_loadu_si128(/* 16 个 8 位无符号整数 */);__m128i m3 = _mm_adds_epu8(m1, m2); 我有兴趣对“小于"进行比较在这些无符号整数上,类似 ..
发布时间:2022-01-06 13:04:10 C/C++开发

在 x86 linux 上使用软件浮点

是否(很容易)可以在 i386 linux 上使用软件浮点而不产生每次调用时陷入内核的费用?我试过 -msoft-float,但似乎普通(ubuntu)C 库没有包含 FP 库: $ gcc -m32 -msoft-float -lm -o test test.c/tmp/cc8RXn8F.o:在函数“main"中:test.c:(.text+0x39):对`__muldf3'的未定义引用col ..
发布时间:2022-01-06 13:04:04 服务器开发

为什么在 Pentium IA-32 上不能将一个字节压入堆栈?

我了解到您不能将一个字节直接推送到英特尔奔腾的堆栈上,有人可以向我解释一下吗? 我得到的原因是因为 esp 寄存器是可字寻址的(或者,这是我们模型中的假设)并且它必须是“偶数地址".我会假设递减某个 32 位二进制数的值不会影响寄存器的对齐,但显然我还不够了解. 我尝试了一些 NASM 测试,发现如果我声明一个变量(bite db 123)并将其压入堆栈,esp 会减少 4(表示它压入 ..
发布时间:2022-01-06 13:03:58 其他开发

为什么 IA-32 有一个非直观的调用者和被调用者寄存器保存约定?

IA-32 的通用调用约定说: • 被调用者保存寄存器%ebx、%esi、%edi、%ebp、%espCallee 不得更改这些.(或者在返回之前恢复调用者的值.)• 呼叫者保存寄存器%eax, %edx, %ecx, 条件标志如果要保留它们,调用方会保存这些.被叫方可以自由地破坏. 为什么会存在这个奇怪的约定?为什么不在调用另一个函数之前保存所有寄存器?或者让被调用者使用 pusha/pop ..
发布时间:2022-01-06 13:03:51 其他开发

存储缓冲区和行填充缓冲区如何相互作用?

我正在阅读 MDS 攻击论文RIDL:Rogue In-Flight Data Load.他们讨论了 Line Fill Buffer 如何导致数据泄漏.有 关于 RIDL 漏洞和“重播"加载问题,讨论漏洞利用的微架构细节. 阅读该问题后,我不清楚的一件事是,如果我们已经有存储缓冲区,为什么还需要行填充缓冲区. John McCalpin 在 WC-buffer 如何与 LFB 相关联 ..

x86 Linux 汇编器从 _start 获取程序参数

我正在尝试创建一个程序来仅在屏幕上写入参数.我创建了一些程序来获取 C 函数参数,或者我使用 C 将参数发送到我的 asm 程序.有没有办法只使用汇编程序获取程序参数 例如: ./程序“文本" 我正在使用 (Gnu 汇编程序) 通常我使用这些参数 [esp+4] 因为 esp 是程序/函数调用指针,但在纯 asm 中它没有获取命令行参数. 有没有办法做到这一点? 我 ..
发布时间:2022-01-06 13:03:15 服务器开发

32 位 x86 汇编中堆栈对齐的职责

我试图清楚地了解谁(调用者或被调用者)负责堆栈对齐.64 位汇编的情况相当清楚,它是由调用者进行的. 参考 System V AMD64 ABI,第 3.2.2 节 堆栈框架: 输入参数区域的末尾应对齐在 16(32,如果__m256 在堆栈上传递)字节边界. 换句话说,应该可以安全地假设,对于被调用函数的每个入口点: 16 |(%rsp + 8) holds(额外的 ..
发布时间:2022-01-06 13:02:59 服务器开发

什么特别将 x86 缓存行标记为脏 - 任何写入,或者是否需要显式更改?

这个问题专门针对现代 x86-64 缓存一致性架构 - 我很欣赏其他 CPU 上的答案可能会有所不同. 如果我写入内存,MESI 协议要求先将缓存行读入缓存,然后在缓存中修改(将值写入缓存行,然后将其标记为脏).在较旧的 write-though 微架构中,这将触发缓存线被刷新,在回写下,被刷新的缓存线可能会延迟一段时间,并且在两种机制下都可能发生一些写组合(更可能是写回).而且我知道这如何 ..
发布时间:2022-01-06 13:02:43 其他开发

当被减数为零时,为什么在减法过程中设置进位标志?

目前我为非常大的无符号整数的算术和逻辑运算编写了自己的小库.为了提高性能,我决定在汇编中实现一些功能.所以这是我的问题.在减去两个无符号整数时,当我从 0 中减去任何数字时,会设置进位标志. 但为什么在这种情况下设置进位标志?进位标志仅在发生溢出时设置,但如果我从零中减去任何数字,则不会发生溢出.还是我错了? 解决方案 进位标志是从最高位(MSb)进位或借位: CF(位 0)进 ..
发布时间:2022-01-06 13:02:37 其他开发

x86 组件上的保护模式键盘访问

我正在为我正在开发的一个非常基本的内核处理键盘输入,但我完全卡住了.我似乎无法在网上找到任何可以显示我需要了解的信息的信息. 我的内核现在正在保护模式下运行,所以我无法使用实模式键盘例程而不跳转到实模式并返回,我试图避免这种情况.我希望能够从保护模式访问我的键盘.有谁知道如何做到这一点?到目前为止我发现的唯一一件事是它涉及使用输入/输出端口直接与控制器对话,但除此之外我很难过.当然,这不是经 ..
发布时间:2022-01-06 13:02:11 其他开发

volatile sig_atomic_t 的正确使用

根据 this 站点,可以在信号处理程序中使用 volatile sig_atomic_t 类型的变量.现在我的问题是,例如下面的代码仍然是原子的,因此不会引入竞争条件吗? 假设我们使用的是多核处理器(编辑:运行多线程程序).volatile sig_atomic_t 甚至首先适用于多核系统,还是我们应该使用 C++11 的 atomic 来处理多核系统上的信号处理程序(EDIT:运行多线程 ..
发布时间:2022-01-06 13:02:02 服务器开发

用汇编语言打印出一个数字?

mov al,10添加 al,15 如何打印“al"的值? 解决方案 你试过 int 21h 服务 2?DL 是要打印的字符. mov dl,'A' ;打印“A"移动啊,221 小时 要打印整数值,您必须编写一个循环来将整数分解为单个字符.如果你可以用十六进制打印值,这很简单. 如果您不能依赖 DOS 服务,您也可以使用 BIOS int 10h 将 AL 设置为 0Eh 或 ..
发布时间:2022-01-06 13:01:52 其他开发

如何从程序访问控制寄存器 cr0,cr2,cr3?获取分段错误

我编写了一个程序,试图读取和写入控制寄存器. 程序编译正常,但是当内联汇编即将执行时,它产生了一个分段错误. 代码: void 指令(int val){国际我;整数值;for(i = 0; i 我使用 GDB 并通过每条装配线,在 mov %cr0,%eax 上发生了分段错误. 谁知道哪里出了问题? 解决方案 引用自 英特尔® 64 和 IA-32 架构软件开发人员 ..
发布时间:2022-01-06 13:01:43 其他开发

汇编语言中的寻址模式 (IA-32 NASM)

由于这方面的网络资源很少,为了将来搜索的方便,我将首先列出 IA-32 汇编语言 (NASM) 的地址模式,然后跟进一个快速问题. 注册地址 mov eax, ebx:将 ebx 中的内容复制到 eax 中 mov esi, var:将 var 的地址(比如 0x0040120e)复制到 esi 中 立即寻址(第二个操作数是立即数) mov bx, 20: 16位寄存器bx获取实 ..
发布时间:2022-01-06 13:01:35 其他开发

为什么 Linux/gnu 链接器选择地址 0x400000?

我正在 Linux x86_64 上试验 ELF 可执行文件和 gnu 工具链: 我已经链接并(手动)剥离了一个“Hello World"测试: .global _start.文本_开始:移动 $1, %rax... 转换为 267 字节的 ELF64 可执行文件... 0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF………… ..
发布时间:2022-01-06 13:01:30 服务器开发

为什么 RDTSC 不是序列化指令?

关于 RDTSC 指令的英特尔手册警告说乱序执行RDTSC 实际执行时可以改变,所以他们建议在它前面插入一条 CPUID 指令,因为 CPUID 会序列化指令流(CPUID 永远不会乱序执行).我的问题很简单:如果他们有能力使指令序列化,他们为什么不进行 RDTSC 序列化?它的全部意义似乎是获得周期准确的计时.是否存在您不想想在它前面加上序列化指令的情况? 较新的 Intel CPU 有一 ..
发布时间:2022-01-06 13:01:20 其他开发

MOVDQA 和 MOVAPS x86 指令之间的区别?

我正在查看英特尔数据表:英特尔® 64 和 IA-32 架构Software Developer's Manual 和我找不到 之间的区别 MOVDQA:移动对齐双四字 MOVAPS:移动对齐打包单精度 在英特尔数据表中,我可以找到这两个指令: 此指令可用于从 128 位内存位置,将 XMM 寄存器的内容存储到128 位内存位置,或在两个 XMM 寄存器之间移动数据. 唯一 ..
发布时间:2022-01-06 13:01:12 其他开发