inline-assembly相关内容
我正在学习如何使用 __ asm__ volatile 在GCC中提出了一个问题.我想实现一个执行原子比较和交换并返回先前存储在目标中的值的函数. 为什么"= a"(预期)输出约束起作用,但是"= r"(预期)约束使得编译器生成的代码不能工作吗? 案例1. #include#include#includeuint6
..
我们在默认配置中使用Clang.在默认配置中,使用的是Clang的集成汇编程序(而不是系统汇编程序,如GAS).我无法确定以下问题的确切问题(并解决): make...clang ++ -DNDEBUG -g2 -O3 -Wall -fPIC -arch i386 -arch x86_64 -pipe -Wno-tautologic-compare -c integer.cppinteger.
..
我正在执行操作系统实施工作. 这是第一个代码: //生成软件中断void generate_interrupt(int n){asm("mov al,byte ptr [n]");asm("mov byte ptr [genint + 1],al");asm("jmp genint");asm("genint:");asm("int 0");} 我正在使用gcc中的 -masm = i
..
如标题中所述,我想知道有什么方法可以在Linux OS(例如ubuntu)中编译Microsoft样式的内联汇编代码(如下所示). _asm {mov edi,A;....EMMS;} 该示例代码是行内汇编代码的一部分,可以使用cl.exe编译器在win10上成功编译该代码.有什么办法可以在Linux上编译它吗?我是否必须以GNU c/c ++样式(即__asm __ {;;;})重写它?
..
我已经做了一段时间的arm asm,并尝试使用x86 asm ssse3优化简单的循环.我找不到将大字节序转换为小字节序的方法. ARM NEON仅具有一个矢量指令即可完成此操作,而SSSE3则没有.我尝试使用2个移位,然后使用一个或,但是如果我们向左移动8个(数据饱和),则需要将每个插槽的位数改为32位而不是16位. 我查看了PSHUFB,但是当我使用它时,16位字的前半部分始终为0
..
我正在gem5模拟器中的X86体系结构中对自定义MOV指令进行建模,以测试其在模拟器上的实现,我需要使用内联汇编来编译我的C代码以创建一个二进制文件.但是由于它是GCC编译器中尚未实现的自定义指令,因此编译器将抛出错误.我知道一种方法是扩展GCC编译器以接受我的自定义X86指令,但是我不想这样做,因为它比较耗时(但是以后会这样做). 作为一个临时技巧(只是检查我的实现是否值得).我想在模拟器
..
首先,如果有人知道标准C库的功能,则打印一个没有寻找二进制零的字符串,但是需要绘制的字符数,请告诉我! 否则,我有这个问题: void printStringWithLength(char * str_ptr,int n_chars){asm("mov 4,%rax");//函数号(写)asm("mov 1,%rbx");//文件描述符(stdout)asm("mov $ str_ptr
..
我正在做一些关于功能安全性的事情.我需要验证一些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),"=
..
我有一个正在处理的OS项目,并且试图通过内联汇编调用从C中的磁盘读取的数据. 我已经尝试使用内联汇编读取代码并使用汇编调用指令执行它. void driveLoop(){uint16_t个扇区= 31;uint16_t扇区= 0;uint16_t basesector = 40000;uint32_t i = 40031;uint16_t代码[sectors] [256];int x =
..
我是C ++和基准测试的新手 我不明白这段代码的作用是什么?因此,我找到了一些有关edx,eax寄存器的信息,但我不完全了解它如何在代码中发挥作用.所以我理解这段代码本质上返回了cpu周期的当前滴答声.因此,它将当前滴答存储在寄存器中,一部分存储在hi中,另一部分存储在lo中.并且,"= a"和"= d"是否指定了将其存储在哪个寄存器中. 将其分为两部分的意义何在? "rdtsc":
..
GCC的内联汇编器识别声明符 = r 和 =& r .这些对我来说很有意义: = r 使汇编程序可以将输入寄存器重用于输出. 但是,GCC的内联汇编器也可以识别声明符 + r 和 +& r .这些对我来说意义不大.毕竟, + r 和 +& r 之间的区别不是没有区别的区别吗?难道仅 + r 不足以告诉编译器为单独使用单个变量保留一个寄存器吗? 例如,以下GCC代码有什么问题? #i
..
我了解到,如果在垃圾清单中指定"cc",则表明汇编代码会修改标志寄存器 编写一个示例程序,以检查添加"cc"与不添加之间的区别.比较程序集时,我们添加"cc"没有任何改变. #includeint main(无效){无符号长整数;asm("incq%0":"= r"(sum)//输出操作数:"r"(sum)//输入操作数);printf("sum =%lu \ n",
..
出于测试目的,我正在使用Icc内联汇编程序为Intel Xeon Phi编写简短的汇编代码段.现在,我想使用带掩码的向量指令,但是无法将它们提供给内联汇编器. 对于这样的代码: vmovapd -64(%% r14,%% r10),%% zmm0 {%% k1} 我收到错误消息 /tmp/icpc5115IWas_.s:汇编程序消息:/tmp/icpc5115IWas_.s:563
..
我正在尝试在x86-64 asm(实际上是使用GDC编译器嵌入Dlang的嵌入式asm)中围绕pcmpestri编写一个最小的循环.我有些不明白的事 我正在使用带有两个指向字符串的指针的pcmpestri,是rax和rdx中字符串的长度吗? 如果是,单位是什么?总是以字节为单位,还是以字符数为单位,其中uword的1个计数= 2个字节? pcmpestri是否检查短字符串?即len st
..
我对GNU程序集内联非常陌生,我读过多次文章,但仍然不完全了解发生了什么.据我了解: 移动%eax,%ebx \ n \ t 会将%eax 中的内容移动到 ebx 中,但不会添加内容彼此 addl%eax,%ebx \ n \ t 将使用 ebx 添加%eax 的内容,并将其保持在最右边注册 addl%1,%0 \ n \ t 这是我感到困惑的地方,我们要添加1和0?为什么我们需
..
我正在尝试使用内联汇编编写自己的_start函数.但是,当我尝试从堆栈(%rsp和%rsp + 8)读取argc和argv时,我得到了错误的值.我不知道我在做什么错. #include#include#include#includeint main(int argc,char * argv []){prin
..
所以我搞乱了内联汇编,并使用 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);}
..
下面的C代码应简单地执行相同汇编代码的 p 次,这反过来仅应将16个循环中的 ecx 寄存器从16减少到0./p> 当 p 很小时,程序会快速完成,但是当 p 很高时(例如 p = 16 ),其执行时间会增加指数. #include#includeint main(){整数p = 16;我for(i = 0; i
..
我正在编写一个对性能至关重要的数字运算C ++项目,其中200%的核心模块使用了70%的时间. 我想使用内联汇编来优化内核,但是我对此是全新的.但是,我确实知道一些x86汇编语言,包括GCC和NASM使用的一种. 我所知道的 我必须将汇编程序指令放在我希望它们所在的 _asm {} 中. 问题: 我不知道从哪里开始.我的嵌入式程序集开始运行时,哪个寄存器会起作用?
..
AVX512为其算术命令引入了opmask功能.一个简单的示例: godbolt.org . #include__m512i add(__ m512i a,__m512i b){__m512i总和;asm("mov ebx,0xAAAAAAAA; \ n \ t""kmovw k1,ebx; \ n \ t""vpaddd%[SUM]%{k1%}%{z%},%[A]
..