inline-assembly相关内容
我正在调试一些汇编代码,在阅读了一些文档后,我不确定我是否 100% 理解约束.我想知道是否有人可以让我直截了当.如果我有以下代码(arm32): int foo(int in1, int *ptr1) {输入输出1=123;asm 易变的 (" cmp %[in1], #0;"" bne 1b;""dmb;""mov %[out1], #0;""1: strex %[in1], [%[ptr1
..
我正在尝试使用 ARM Compiler 5 为 Cortex A 微处理器编译以下两段代码: 第 1 部分: static inline void cp15_write_sctlr(uint32_t value){asm(“mcr p15, 0, %0, c1, c0, 0"::“r"(值));}静态内联 uint32_t cp15_read_actlr(void){uint32_t a
..
我想编写统一的程序集来摆脱烦人的 # 在我的文字前面提到的:ARM 汇编中的立即数是否需要散列? 这是一个带有#的最小非统一代码: #include #include int main(void) {uint32_t io = 0;__asm__ ("添加 %0, %0, #1;": "+r" (io)::);断言(io == 1);} 在 QEMU 下编译后运行良好: arm-lin
..
对于两个整数相加,我写: int sum;asm volatile("add %0, x3, x4" : "=r"(sum) : :); 我怎样才能用两个浮点数来做到这一点?我试过了: 浮点数;asm volatile("fadd %0, s3, s4" : "=r"(sum) : :); 但它给了我一个错误: 错误:操作数 1 应该是 SIMD 向量寄存器 -- `fadd x0,
..
我需要在我的 newlib 存根中调用一些系统调用,当前的实现使用 C 宏,随着时间的推移,这些宏变得不可读且看起来很糟糕.(而且我讨厌宏...)但是,我使用 C++ 模板的实现仅适用于一个参数: template 内联 RETTYPE 系统调用(PARAM1 p1){寄存器 PARAM1 r0 asm("r0") = p1;asm volatile("svc %[nr]\n":“=r"(r0)
..
我有一个奇怪的.我正在使用供应商的头文件开发嵌入式系统.我正在使用 GCC 4.6.3 编译文件.我想在我的代码中使用 C++,我有我无法弄清楚的错误.我正在运行一个供应商示例程序,我所做的只是将 main.c 文件的名称更改为 main.cpp.因此,我假设头文件正在由 C++ 编译器解释.其中之一包含以下几行: __attribute__((naked)) 静态 return_type 签名
..
问题 我想在 Linux Android 设备上使用内联汇编在 ARM 中执行退出系统调用,并且我想从内存中的某个位置读取退出值. 示例 不提供这个额外的参数,调用的宏看起来像: #define ASM_EXIT() __asm__("mov %r0, #1\n\t"\“mov %r7, #1\n\t"\“swi #0") 这很好用.为了接受一个论点,我将其调整为: #de
..
我正在尝试在 ARM Cortex-a8 上实现一个将 32 位操作数与 256 位操作数相乘的函数.问题是我的寄存器用完了,我不知道如何减少这里使用的寄存器的数量.这是我的功能: typedef struct UN_256fe{uint32_t uint32[8];}UN_256fe;typedef struct UN_288bite{uint32_t uint32[9];}UN_288bit
..
对于我的项目我必须使用内联汇编指令例如rdtsc来计算一些C/C++指令的执行时间. 以下代码似乎适用于 Intel 但不适用于 ARM 处理器: {unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d));t0 = ((unsigned long)a) |(((unsigned long)d)
..
我想为我的测试夹具的测试引发 ARM Cortex-M3 未定义指令异常.IAR 编译器支持这样的内联汇编: asm("udf.w #0"); 不幸的是,GNU CC 内联汇编器不知道 NXP LPC177x8x 的这个操作码.它写入诊断信息: ccw3kZ46.s:404: 错误:错误指令 `udf.w #0' 如何创建导致未定义指令异常的函数? 解决方案 以 Masta
..
ARM 汇编中的这一行是做什么的? mrc p15, 0, %0, c9, c13, 0"::“r"(柜台) 什么是p15?通常寄存器以 r 为前缀,例如 r15. :: 的符号是什么,作用是什么或c9,c1? 解决方案 虽然 MRC 是通用协处理器互操作指令,cp15 是 控制处理器 - 所有现代 ARM CPU 都有,ARM 已经使用它来扩展片上单元的指令集,例如缓存、MMU
..
我想访问内联臂程序集中在 C 中声明的局部变量.我该怎么做? 全局变量可以这样访问, int temp = 0;功能(){__asm(".global temp\n\t""LDR R2,=temp\n\t""LDR R2, [R2, #0]\n\t");} 但是我如何访问局部变量呢?我尝试将局部变量的“.global"更改为“.local",但它产生了错误(对“temp"的未定义引用).
..
这是参考问题:Neon Intrinsics 的校验和代码实现 将链接中列出的子问题作为单独的单独问题打开.因为不能在单线程中提出多个问题. 无论如何都要回答这个问题: ARM 和 NEON(就 arm cortex-a8 架构而言)真的可以并行工作吗?我怎样才能做到这一点? 有人可以指点我或分享一些使用ARM-NEON互操作的示例实现(伪代码/算法/代码,而不是理论实现论
..
在 x86 内联汇编中,我可以这样写: asm ("cpuid": "=a" (_eax),"=b" (_ebx),"=c" (_ecx),"=d" (_edx): "a" (op)); 所以在 matchin 约束中,而不是只写“=r"并让编译器选择寄存器,我可以说我想使用哪个特定的寄存器(=a 例如使用 %eax) 我如何为 ARM 程序集执行此操作?ARM GCC 汇编手册 htt
..
我已经开始在 GCC/G++ 下开发一个小型的 16 位操作系统.我使用的是在 Cygwin 下编译的 GCC 交叉编译器,我将 asm(".code16gcc\n") 作为每个 .CPP 文件的第一行,使用 Intel ASM 语法和用于编译和链接.CPP 文件如下所示: G++: i586-elf-g++ -c $(CPP_FILE) -o $(OBJECT_OUTPUT) -nostdin
..
g++ 向我抱怨以下代码中缺少括号: 1 2 3v v v__asm__ volatile("inb %1, %0" : "=a" (result) : "Nd" (portnumber) );^ ^ ^1 2 3 如您所见,括号是匹配的,并且有三个左括号和三个右括号. 还有更多信息,我正在关注 youtube 教程 解决方案 您在输出之前有一个额外的 :,因此您最终在输出声明
..
在一个答案中,我已经说过未对齐的访问几乎与长时间对齐访问的速度相同(在 x86/x86_64 上).我没有任何数字来支持这个说法,所以我为它创建了一个基准. 您是否发现此基准测试有任何缺陷?你能改进它吗(我的意思是,增加 GB/秒,以便更好地反映事实)? #include #include 模板 __attribute__((noinline))void loop32(con
..
我一直在研究 C 中的内联汇编以及调用堆栈的工作原理,但我一直无法弄清楚是否可以检索请求函数返回值的变量的地址,从函数内. int hypothetical_func(){/*..... 一些程序集从调用堆栈中获取“int a"的地址?...*/返回 5;}int main(){int a = hypothetical_func();} 这可能吗? 解决方案 NO.int 在寄存器中返
..
我编写了一个代码,在Xeon Phi intel协处理器上使用具有(512位长向量)的KNC指令添加两个数组.但是,我在内联汇编部分中有细分部分. 这是我的代码: int main(int argc,char * argv []){我const int length = 65536;const int AVXLength =长度/16;float * A =(float *)aligne
..
我正在学习如何使用 __ asm__ volatile 在GCC中提出了一个问题.我想实现一个执行原子比较和交换并返回先前存储在目标中的值的函数. 为什么"= a"(预期)输出约束起作用,但是"= r"(预期)约束使得编译器生成的代码不能工作吗? 案例1. #include#include#includeuint6
..