inline-assembly相关内容

为什么我的"= r"(变量)输出没有选择与"a"(变量)输入相同的寄存器?

我正在学习如何使用 __ asm__ volatile 在GCC中提出了一个问题.我想实现一个执行原子比较和交换并返回先前存储在目标中的值的函数. 为什么"= a"(预期)输出约束起作用,但是"= r"(预期)约束使得编译器生成的代码不能工作吗? 案例1. #include#include#includeuint6 ..
发布时间:2021-05-16 18:35:19 其他开发

有什么方法可以在Linux平台上编译Microsoft风格的内联汇编代码?

如标题中所述,我想知道有什么方法可以在Linux OS(例如ubuntu)中编译Microsoft样式的内联汇编代码(如下所示). _asm {mov edi,A;....EMMS;} 该示例代码是行内汇编代码的一部分,可以使用cl.exe编译器在win10上成功编译该代码.有什么办法可以在Linux上编译它吗?我是否必须以GNU c/c ++样式(即__asm __ {;;;})重写它? ..
发布时间:2021-05-16 18:35:10 服务器开发

尝试使用x86 asm SSSE3将大字节序转换为小字节序

我已经做了一段时间的arm asm,并尝试使用x86 asm ssse3优化简单的循环.我找不到将大字节序转换为小字节序的方法. ARM NEON仅具有一个矢量指令即可完成此操作,而SSSE3则没有.我尝试使用2个移位,然后使用一个或,但是如果我们向左移动8个(数据饱和),则需要将每个插槽的位数改为32位而不是16位. 我查看了PSHUFB,但是当我使用它时,16位字的前半部分始终为0 ..
发布时间:2021-05-16 18:35:07 C/C++开发

x86中未使用或使用最少的MOV指令,可用于自定义MOV扩展

我正在gem5模拟器中的X86体系结构中对自定义MOV指令进行建模,以测试其在模拟器上的实现,我需要使用内联汇编来编译我的C代码以创建一个二进制文件.但是由于它是GCC编译器中尚未实现的自定义指令,因此编译器将抛出错误.我知道一种方法是扩展GCC编译器以接受我的自定义X86指令,但是我不想这样做,因为它比较耗时(但是以后会这样做). 作为一个临时技巧(只是检查我的实现是否值得).我想在模拟器 ..
发布时间:2021-05-16 18:35:03 其他开发

我如何体验"LFENCE或SFENCE无法通过较早的读/写"?

我正在做一些关于功能安全性的事情.我需要验证一些X86 CPU指令,例如LFENCE,SFENCE和MFENCE. 现在,根据英特尔SDM第8.2.3.4节“可以通过较早的存储将负载重新排序到其他位置,"我可以体验MFENCE. "xor%0,%0 \ n \ t"“电影$ 1,%1 \ n \ t""mfence \ n \ t"“%2,%0 \ n \ t":"= r"(r1),"= ..
发布时间:2021-05-16 18:34:56 其他开发

如何通过内联汇编调用存储在数组中的十六进制数据?

我有一个正在处理的OS项目,并且试图通过内联汇编调用从C中的磁盘读取的数据. 我已经尝试使用内联汇编读取代码并使用汇编调用指令执行它. void driveLoop(){uint16_t个扇区= 31;uint16_t扇区= 0;uint16_t basesector = 40000;uint32_t i = 40031;uint16_t代码[sectors] [256];int x = ..
发布时间:2021-05-16 18:34:53 其他开发

"rdtsc":"= a"(a0),"= d"表示(d0)这是做什么的?

我是C ++和基准测试的新手 我不明白这段代码的作用是什么?因此,我找到了一些有关edx,eax寄存器的信息,但我不完全了解它如何在代码中发挥作用.所以我理解这段代码本质上返回了cpu周期的当前滴答声.因此,它将当前滴答存储在寄存器中,一部分存储在hi中,另一部分存储在lo中.并且,"= a"和"= d"是否指定了将其存储在哪个寄存器中. 将其分为两部分的意义何在? "rdtsc": ..
发布时间:2021-05-16 18:34:50 C/C++开发

"+& r"如何与"+ r"不同吗?

GCC的内联汇编器识别声明符 = r 和 =& r .这些对我来说很有意义: = r 使汇编程序可以将输入寄存器重用于输出. 但是,GCC的内联汇编器也可以识别声明符 + r 和 +& r .这些对我来说意义不大.毕竟, + r 和 +& r 之间的区别不是没有区别的区别吗?难道仅 + r 不足以告诉编译器为单独使用单个变量保留一个寄存器吗? 例如,以下GCC代码有什么问题? #i ..
发布时间:2021-05-16 18:34:44 其他开发

当我们添加"cc"时,在汇编输出中会发生什么?到清单清单

我了解到,如果在垃圾清单中指定"cc",则表明汇编代码会修改标志寄存器 编写一个示例程序,以检查添加"cc"与不添加之间的区别.比较程序集时,我们添加"cc"没有任何改变. #includeint main(无效){无符号长整数;asm("incq%0":"= r"(sum)//输出操作数:"r"(sum)//输入操作数);printf("sum =%lu \ n", ..
发布时间:2021-05-16 18:34:41 其他开发

掩码矢量Intel AVX-512指令的汇编语法

出于测试目的,我正在使用Icc内联汇编程序为Intel Xeon Phi编写简短的汇编代码段.现在,我想使用带掩码的向量指令,但是无法将它们提供给内联汇编器. 对于这样的代码: vmovapd -64(%% r14,%% r10),%% zmm0 {%% k1} 我收到错误消息 /tmp/icpc5115IWas_.s:汇编程序消息:/tmp/icpc5115IWas_.s:563 ..
发布时间:2021-05-16 18:34:38 其他开发

pcmpestri字符单位和倒计时-x86-64 asm

我正在尝试在x86-64 asm(实际上是使用GDC编译器嵌入Dlang的嵌入式asm)中围绕pcmpestri编写一个最小的循环.我有些不明白的事 我正在使用带有两个指向字符串的指针的pcmpestri,是rax和rdx中字符串的长度吗? 如果是,单位是什么?总是以字节为单位,还是以字符数为单位,其中uword的1个计数= 2个字节? pcmpestri是否检查短字符串?即len st ..
发布时间:2021-05-16 18:34:36 其他开发

GNU Assembly Inline:%1和%0是什么意思?

我对GNU程序集内联非常陌生,我读过多次文章,但仍然不完全了解发生了什么.据我了解: 移动%eax,%ebx \ n \ t 会将%eax 中的内容移动到 ebx 中,但不会添加内容彼此 addl%eax,%ebx \ n \ t 将使用 ebx 添加%eax 的内容,并将其保持在最右边注册 addl%1,%0 \ n \ t 这是我感到困惑的地方,我们要添加1和0?为什么我们需 ..
发布时间:2021-05-16 18:34:32 其他开发

为什么发出空的asm命令会交换变量?

所以我搞乱了内联汇编,并使用 GCC 9 对其进行了编译.结果是两个变量a和b被交换而没有实际发出任何直接命令. #includeint main(){诠释a(1),b(2),c(3);asm(“":"= r"(c):"r"(a));asm(“":"= r"(a):"r"(b));asm(“":"= r"(b):"r"(c));printf(“%d%d%d",a,b,c);} ..
发布时间:2021-05-16 18:34:22 C/C++开发

如何在C ++中进行内联汇编(Visual Studio 2010)

我正在编写一个对性能至关重要的数字运算C ++项目,其中200%的核心模块使用了70%的时间. 我想使用内联汇编来优化内核,但是我对此是全新的.但是,我确实知道一些x86汇编语言,包括GCC和NASM使用的一种. 我所知道的 我必须将汇编程序指令放在我希望它们所在的 _asm {} 中. 问题: 我不知道从哪里开始.我的嵌入式程序集开始运行时,哪个寄存器会起作用? ..