inline-assembly相关内容

如何在不扩展内联汇编的情况下在GCC内联汇编中声明和初始化局部变量?

我知道这是一个非常基本的问题,但我确实坚持了下来.实际上,我绝对是GCC语法的新手. 我想使用不带扩展内联汇编的局部变量(带有标签的堆栈地址).类似于Intel语法中的以下代码: DATA1 DB 100MOV AL,DATA1 这是我想可以在GCC中替换的代码: int someFunction(int x){__asm__ volatile(“功能1:"“.数据;"".2by ..
发布时间:2021-05-09 20:58:37 其他开发

对于asm语句中的临时寄存器,我应该使用clobber还是虚拟输出?

正如该问题的标题中所述,当我出于临时原因修改asm语句中的某些寄存器时,在clobber和虚拟输出之间哪个选项更好? 例如,我在链接中实现了两个版本的交换函数,并发现其中两个版本会生成相同数量的输出指令. 我应该使用哪个版本?我是否应该将其与虚拟输出一起使用,以允许编译器选择可以尽可能优化整个功能的寄存器? 如果答案是肯定的,那我什么时候应该使用清除清单?当一条指令要求您将其操作 ..
发布时间:2021-05-09 20:55:52 其他开发

如何防止gcc优化破坏rep movsb代码?

我尝试使用 rep movsb 指令创建我的memcpy代码.禁用优化后,它可以与任何大小完美配合.但是,当我启用优化后,它无法按预期运行. 问题 如何防止gcc优化破坏rep movsb代码? 我的代码是否有问题,导致未定义的行为? 创建我自己的memcpy的动机: 我从 编译并运行 ammarfaizi2 @ integral:〜$ gcc --versio ..
发布时间:2021-05-09 20:55:45 其他开发

在GNU C内联汇编中与push/assign/pop交换?

我在这里阅读一些答案和问题,并不断提出这个建议,但是我注意到,在使用Intel和GCC编译器的Windows上,没有人真正地“确切地"解释了您需要做什么.以下正是我要尝试做的事情. #includeint main(){int x = 1;整数y = 2;//汇编代码开始/*将x推入堆栈; ..
发布时间:2021-05-09 20:54:03 其他开发

“& inline& amp;"C ++中的关键字

因此,关键字“内联"会导致该调用正确地被函数主体替换?所以我猜这意味着我们完全跳过了通话?就像我们查看.asm文件一样,找不到呼叫指令吗? 解决方案 关键字 inline 具有误导性-进行实际的内联既没有必要,也没有足够的意义.它所做的一切:告诉链接器允许该函数的多个定义,这意味着您可以将该函数放在标头中.完成后,编译器将有更好的内联机会,因为在更多地方可以看到函数体.在现代系统中,如果它 ..
发布时间:2021-05-09 19:59:11 C/C++开发

所述“内联"部件包括:C ++中的关键字

因此,关键字“内联"会导致该调用正确地被函数主体替换?所以我猜这意味着我们完全跳过了通话?就像我们查看.asm文件一样,找不到呼叫指令吗? 解决方案 关键字 inline 具有误导性-进行实际的内联既没有必要,也没有足够的意义.它所做的一切:告诉链接器允许该函数的多个定义,这意味着您可以将该函数放在标头中.完成后,编译器将有更好的内联机会,因为在更多地方可以看到函数体.在现代系统中,如果它 ..
发布时间:2021-05-09 19:58:00 C/C++开发

内联汇编FreeBSD中的gettimeofday

对不起,我的英语. 感谢每个答案. 我在C和内联汇编中有以下代码,它们应该执行函数调用:int gettimeofday(struct timeval * tp,struct timezone * tzp); val =(struct timeval *)malloc(sizeof(struct timeval));zone =(struct timezone *)malloc(siz ..
发布时间:2021-05-09 19:30:15 其他开发

FreeBSD syscall比Linux破坏了更多的寄存器?内联asm优化级别之间的不同行为

最近我正在玩freebsd系统调用,因为i386部分在示例)或 setc%cl 来手动实现布尔值.(CL是一个不错的选择,因为您可以将其用作输出而不是破坏器.) FreeBSD的 syscall 处理垃圾R8,R9和R10 ,除了Linux的最低限度破坏外:RAX(retval)和RCX/R11( syscall 指令本身将其用于我们不确定 ;评论将其称为“返回值2".(即作为RDX:RAX ..
发布时间:2021-05-09 19:30:11 其他开发

使用更新的CPU指令支持构建向后兼容的二进制文件

实现同一功能的多个版本的最佳方法是使用特定的CPU指令(如果在运行时进行了测试),或者如果使用慢的实现则回退到较慢的实现? 例如,x86 BMI2提供了非常有用的 PDEP 指令.我将如何编写C代码,以便在启动时测试正在执行的CPU的BMI2可用性,并使用两种实现方式之一-一种使用 _pdep_u64 调用(可用于 -mbmi2 ),另一个使用C代码“手动"进行位操作.是否有针对此类情况的内置支 ..
发布时间:2021-04-23 20:07:30 其他开发

在两个ASM GCC内联块之间传播进位

亲爱的Assembly/C ++开发人员, 问题是:即使在两个ASM块之间传播进位(或任何标志)是否现实或完全疯狂? 几年前,我开发了一个整数库,用于小于512位(在编译时)的大型算术运算.我目前未使用GMP,因为对于这种规模,由于内存分配和模型为二进制表示形式选择工作台. 我必须承认我使用 BOOST_PP 创建了我的ASM(字符串块),它不是非常光荣(出于好奇,请看一下 ..
发布时间:2021-04-22 18:44:39 C/C++开发

什么是clo子?

Clang TargetInfo 的方法称为getClobbers : 以LLVM格式返回目标特定的字符串. 那么,什么是clo子? 解决方案 被破坏的寄存器是被破坏的寄存器,即由内联汇编器以不可预测的方式进行修改.这通常在您需要临时工时发生.注册或使用特定的指令,而该指令恰好将某些寄存器作为副产品进行修改. 通常,程序员会显式地声明被其内联asm代码破坏的寄存器,但默认 ..
发布时间:2021-04-22 18:41:00 其他开发

GCC内联汇编程序的“内存"Clobber不会阻止重新排列ARM中的代码

我阅读了有关GCC内联汇编器的文章( http://www.ethernut.de/en/documents/arm-inline-asm.html ). 在本文中,“内存" Clobber强制编译器存储所有在执行汇编程序之前先缓存值,然后在执行后重新加载它们指示.并且必须保留顺序. 这是示例.以下代码旨在将c乘以b,其中一个或两个都乘以b可以通过中断例程进行修改.禁用中断之前访问变量 ..
发布时间:2021-04-09 19:27:10 其他开发