inline-assembly相关内容
我知道这是一个非常基本的问题,但我确实坚持了下来.实际上,我绝对是GCC语法的新手. 我想使用不带扩展内联汇编的局部变量(带有标签的堆栈地址).类似于Intel语法中的以下代码: DATA1 DB 100MOV AL,DATA1 这是我想可以在GCC中替换的代码: int someFunction(int x){__asm__ volatile(“功能1:"“.数据;"".2by
..
我尝试在gcc中混合使用SSE2内部函数和内联汇编程序.但是,如果我将变量指定为xmm0/register作为输入,则在某些情况下会出现编译器错误.示例: #includeint main(){__m128i test = _mm_setzero_si128();asm("pxor %% xmm0,%% xmm0"::"xmm0"(测试):);} 使用gcc 4
..
我正在使用以下代码将cr0位置1以禁用缓存.当我编译这个 #includeint main(){__asm __("pushl%eax \ n \ t"“移动%cr0,%eax; \ n \ t""orl $(1
..
尝试使用内联汇编将400乘以2,使用事实 imul 隐式乘以 eax .但是,我收到“未定义的引用",将编译错误编译为 $ 1 和 $ 2 int c;整数a = 400;int b = 2;__asm __(".intel_syntax;""mov eax,1美元;""mov ebx,2美元;""imul%0,ebx;"".att_syntax;":"= r"(c):"r"(a),"r"(b
..
我有一个修改(ecx)(或任何其他寄存器)的函数(C) int proc(int n){诠释asm volatile("movl%1,%% ecx \ n \ t"//mov(n)到ecx"addl $ 10,%% ecx \ n \ t"//将(10)添加到ecx(n)“移动%% ecx,%0"/* ret = n + 10 */:"= r"(ret):"r"(n):"ecx");返回ret
..
正如该问题的标题中所述,当我出于临时原因修改asm语句中的某些寄存器时,在clobber和虚拟输出之间哪个选项更好? 例如,我在链接中实现了两个版本的交换函数,并发现其中两个版本会生成相同数量的输出指令. 我应该使用哪个版本?我是否应该将其与虚拟输出一起使用,以允许编译器选择可以尽可能优化整个功能的寄存器? 如果答案是肯定的,那我什么时候应该使用清除清单?当一条指令要求您将其操作
..
我尝试使用 rep movsb 指令创建我的memcpy代码.禁用优化后,它可以与任何大小完美配合.但是,当我启用优化后,它无法按预期运行. 问题 如何防止gcc优化破坏rep movsb代码? 我的代码是否有问题,导致未定义的行为? 创建我自己的memcpy的动机: 我从 编译并运行 ammarfaizi2 @ integral:〜$ gcc --versio
..
我在这里阅读一些答案和问题,并不断提出这个建议,但是我注意到,在使用Intel和GCC编译器的Windows上,没有人真正地“确切地"解释了您需要做什么.以下正是我要尝试做的事情. #includeint main(){int x = 1;整数y = 2;//汇编代码开始/*将x推入堆栈;
..
因此,关键字“内联"会导致该调用正确地被函数主体替换?所以我猜这意味着我们完全跳过了通话?就像我们查看.asm文件一样,找不到呼叫指令吗? 解决方案 关键字 inline 具有误导性-进行实际的内联既没有必要,也没有足够的意义.它所做的一切:告诉链接器允许该函数的多个定义,这意味着您可以将该函数放在标头中.完成后,编译器将有更好的内联机会,因为在更多地方可以看到函数体.在现代系统中,如果它
..
因此,关键字“内联"会导致该调用正确地被函数主体替换?所以我猜这意味着我们完全跳过了通话?就像我们查看.asm文件一样,找不到呼叫指令吗? 解决方案 关键字 inline 具有误导性-进行实际的内联既没有必要,也没有足够的意义.它所做的一切:告诉链接器允许该函数的多个定义,这意味着您可以将该函数放在标头中.完成后,编译器将有更好的内联机会,因为在更多地方可以看到函数体.在现代系统中,如果它
..
对不起,我的英语. 感谢每个答案. 我在C和内联汇编中有以下代码,它们应该执行函数调用:int gettimeofday(struct timeval * tp,struct timezone * tzp); val =(struct timeval *)malloc(sizeof(struct timeval));zone =(struct timezone *)malloc(siz
..
最近我正在玩freebsd系统调用,因为i386部分在示例)或 setc%cl 来手动实现布尔值.(CL是一个不错的选择,因为您可以将其用作输出而不是破坏器.) FreeBSD的 syscall 处理垃圾R8,R9和R10 ,除了Linux的最低限度破坏外:RAX(retval)和RCX/R11( syscall 指令本身将其用于我们不确定 ;评论将其称为“返回值2".(即作为RDX:RAX
..
当我们在通常的C/C ++ CUDA代码中编写内联PTX程序集时,例如: __ device__ __inline__ uint32_t bfind(uint32_t val){uint32_t ret;asm("bfind.u32%0,%1;":"= r"(ret):"r"(val));返回ret} 我们可以在 asm 之后添加 volatile 关键字,例如: __ device_
..
一些代码: int x = 1;for(int i = 1; i
..
实现同一功能的多个版本的最佳方法是使用特定的CPU指令(如果在运行时进行了测试),或者如果使用慢的实现则回退到较慢的实现? 例如,x86 BMI2提供了非常有用的 PDEP 指令.我将如何编写C代码,以便在启动时测试正在执行的CPU的BMI2可用性,并使用两种实现方式之一-一种使用 _pdep_u64 调用(可用于 -mbmi2 ),另一个使用C代码“手动"进行位操作.是否有针对此类情况的内置支
..
亲爱的Assembly/C ++开发人员, 问题是:即使在两个ASM块之间传播进位(或任何标志)是否现实或完全疯狂? 几年前,我开发了一个整数库,用于小于512位(在编译时)的大型算术运算.我目前未使用GMP,因为对于这种规模,由于内存分配和模型为二进制表示形式选择工作台. 我必须承认我使用 BOOST_PP 创建了我的ASM(字符串块),它不是非常光荣(出于好奇,请看一下
..
Clang TargetInfo 的方法称为getClobbers : 以LLVM格式返回目标特定的字符串. 那么,什么是clo子? 解决方案 被破坏的寄存器是被破坏的寄存器,即由内联汇编器以不可预测的方式进行修改.这通常在您需要临时工时发生.注册或使用特定的指令,而该指令恰好将某些寄存器作为副产品进行修改. 通常,程序员会显式地声明被其内联asm代码破坏的寄存器,但默认
..
我承担了根据AT& T语法将特定代码从C ++转换为ASM的任务,因此我从简单的示例开始,遇到了第一个问题. 我从中开始练习的代码 void func(){int num = 1;std :: cout
..
我阅读了有关GCC内联汇编器的文章( http://www.ethernut.de/en/documents/arm-inline-asm.html ). 在本文中,“内存" Clobber强制编译器存储所有在执行汇编程序之前先缓存值,然后在执行后重新加载它们指示.并且必须保留顺序. 这是示例.以下代码旨在将c乘以b,其中一个或两个都乘以b可以通过中断例程进行修改.禁用中断之前访问变量
..
我正在尝试使用 ARM编译器5 为Cortex A微处理器编译以下两段代码: 第1部分: 静态内联void cp15_write_sctlr(uint32_t值){asm("mcr p15,0,%0,c1,c0,0" ::"r"(值));}静态内联uint32_t cp15_read_actlr(void){uint32_t actlr;asm("mrc p15,0,%0,c1,c0,1"
..