Tag: x86

有关在组装中推送ebp和pop ebp指令的说明

我在程序集中使用堆栈,但我没有想到推ebp和pop ebp。 .intel_syntax noprefix .include "console.i" .text askl: .asciz "Enter length: " askb: .asciz "Enter breadth: " ans: .asciz "Perimeter = " _entry: push ebp # establishing stack-frame mov ebp, esp sub esp, 12 Prompt askl GetInt [ebp-4] # length Prompt askb GetInt [ebp-8] # breadth mov eax, [ebp-4] # eax = l add eax, […]

英特尔Broadwell处理器中出现的重大FMA性能exception

代码1: vzeroall mov rcx, 1000000 startLabel1: vfmadd231ps ymm0, ymm0, ymm0 vfmadd231ps ymm1, ymm1, ymm1 vfmadd231ps ymm2, ymm2, ymm2 vfmadd231ps ymm3, ymm3, ymm3 vfmadd231ps ymm4, ymm4, ymm4 vfmadd231ps ymm5, ymm5, ymm5 vfmadd231ps ymm6, ymm6, ymm6 vfmadd231ps ymm7, ymm7, ymm7 vfmadd231ps ymm8, ymm8, ymm8 vfmadd231ps ymm9, ymm9, ymm9 vpaddd ymm10, ymm10, ymm10 vpaddd ymm11, ymm11, ymm11 vpaddd […]

我已经将Windows服务构build为“任何CPU”。 为什么它在我的64位机器上以32位模式运行?

我已经将Windows服务构build为“任何CPU”。 但是,当我在我的64位机上运行它时,它运行在32位。 我该如何解决? 我正在使用.NET和C#,我的操作系统是Windows 2008 R2。 如果我在x64中构build它,它将以64位模式正确加载。 然而,“任何Cpu” – 这是我想要的 – 加载在32位,即使它运行的机器完全支持64位。 编辑根据反馈添加更多信息 我们有第三方工具以及参考c ++托pipe程序集。 这些可能会或可能不会为任何CPU构build。 事实上,我知道c ++托pipe程序集只是为x86构build的。 然而,奇怪的是,如果我特别指定x64的过程将启动,并在x64工作。 如果框架试图加载c ++托pipe程序集,则会失败。 我不介意,因为在代码中,如果我们在64位模式下运行,我们不会加载32位托pipe的++程序集。 难道这个构build数字是因为在这里有一个32位的程序集,它应该把启动过程(在这种情况下是一个Windows服务程序集)标记为x86?

primefacesx86指令的alignment要求

Microsoft提供InterlockedCompareExchange函数来执行primefaces比较和交换操作。 还有一个_InterlockedCompareExchange 内部 。 在x86上,这些是使用cmpxchg指令来实现的。 但是,通过阅读这三种方法的文件,他们似乎并不同意alignment要求。 英特尔的参考手册没有提到任何关于alignment的内容(除了如果启用了alignment检查并产生未alignment的内存引用,则会产生exception) 我也查了一下lock前缀,具体说明了这一点 LOCK前缀的完整性不受内存字段alignment的影响。 (重点是我的) 所以英特尔似乎认为这种联合是无关紧要的。 无论如何,这个操作都是primefaces的。 _InterlockedCompareExchange内在的文档也没有说alignment,但是InterlockedCompareExchange 函数声明 该函数的参数必须在32位边界上alignment; 否则,该function在多处理器x86系统和任何非x86系统上将performance不可预知。 那么给了什么? InterlockedCompareExchange的alignment要求只是为了确保该函数即使在cmpxchg以前的cmpxchg指令不可用的情况下也能正常工作? 这似乎可能基于上述信息,但我想确定之前,我依靠它。 🙂 或者ISA需要alignment以保证primefaces性,而我只是在英特尔的参考手册中查找错误的地方?

在x86中暂停指令

我正在尝试创build自旋锁的哑版。 浏览网页时,我遇到了x86中的汇编指令,这个指令用于向处理器提示当前在该CPU上正在运行旋转locking。 英特尔手册和其他可用信息状态 The processor uses this hint to avoid the memory order violation in most situations, which greatly improves processor performance. For this reason, it is recommended that a PAUSE instruction be placed in all spin-wait loops. The documentation also mentions that "wait(some delay)" is the pseudo implementation of the instruction. 上段的最后一行是直观的。 如果我没有成功抓住锁,我必须等待一段时间,然后再次抓住锁。 但是,在自旋锁的情况下,由于内存顺序违反,我们是什么意思? […]

LEA或ADD指令?

当我手写汇编,我通常select的forms lea eax, [eax+4] 在forms上 add eax, 4 我听说lea是一个“0时钟”指令(如NOP),而“add”则不是。 但是,当我看编译器生成的Assembly时,我经常会看到后面的表单而不是第一个。 我足够聪明地信任编译器,那么谁能说明哪一个更好? 哪一个更快? 为什么编译器select后者的forms?

x86 asm中的括号是什么意思?

给出以下代码: L1 db "word", 0 mov al, [L1] mov eax, L1 括号([L1])代表什么?

分而治之?

显然,x86(也可能是很多其他的指令集)把分频操作的商和余数都放在单独的寄存器中。 现在,我们可以信任编译器来优化这样的代码,只使用一个调用来划分: ( x / 6 ) ( x % 6 ) 他们可能会这样做。 尽pipe如此,做任何语言 (或图书馆,但主要是寻找语言)都支持同时提供分而治之的模式结果吗? 如果是这样,它们是什么,语法是什么样子?

堆栈分配,填充和alignment

我一直试图深入了解编译器如何生成机器码,更具体地说,GCC如何处理堆栈。 为此,我一直在编写简单的C程序,将它们编译成程序集,并尽我所能了解结果。 这里有一个简单的程序和它生成的输出: asmtest.c : void main() { char buffer[5]; } asmtest.s : pushl %ebp movl %esp, %ebp subl $24, %esp leave ret 令我费解的是为什么24字节被分配给堆栈。 我知道,由于处理器如何处理内存,堆栈必须以4为增量进行分配,但如果是这种情况,我们应该只将堆栈指针移动8个字节,而不是24个。作为参考,缓冲区为17字节产生一个移动了40个字节的堆栈指针,并且根本没有任何缓冲区移动堆栈指针8.一个1到16字节的缓冲区移动了ESP 24个字节。 现在假定8个字节是一个必要的常量(它需要什么?),这意味着我们正在分配16个字节的块。 为什么编译器会这样调整呢? 我正在使用x86_64处理器,但是即使是64位字也只需要8字节的alignment方式。 为什么这个差距? 作为参考,我正在使用gcc 4.0.1运行10.5的Mac上进行编译,并且没有启用优化。

开始使用SSE

我想了解更多关于使用SSE的信息 。 除了显而易见的英特尔®64和IA-32架构软件开发人员手册之外,还有什么方法可以学习? 主要是我有兴趣使用GCC X86内置函数 。