inline-assembly 相关问题

嵌入在另一个更高语言的源中的程序集,例如嵌入在C或C ++中的x86程序集。

通过内联汇编使用 FSIN

我想通过gcc / clang的内联汇编来使用x87的FSIN。内部使用 __asm__ 块的 sin() 函数与 64 位双参数看起来如何?使用 __builtin_si...

回答 1 投票 0

错误:‘asm’操作数具有不可能的约束

我想计算单词的长度,但有错误。我不明白为什么。 int new_strlen(字符* 字) { int 长度 = 0; __asm__(“mov ecx,100 ” ...

回答 1 投票 0

如何创建具有多变量寄存器偏移量的内联汇编命令?

以下代码使用 ARMv4 的 gcc,非常好: asm("strb.w r2, [r0, #24 + 8 * 1]"); 现在,如果我尝试以下操作: asm("strb.w r2, [r0, %[偏移] + %[delta] * %[比例]]&q...

回答 1 投票 0

关于arch/arm64/include/asm/atomic.h的atomic_add函数的问题

我对基于 Linux 内核的 C 编码风格非常陌生。我试图理解“arch/arm64/include/asm/atomic.h”中“atomic_add”函数的以下实现 fi...

回答 1 投票 0

这个比较交换函数中的内联汇编是如何工作的? (ARM 上的 %H 修饰符)

静态内联 unsigned long long __cmpxchg64(unsigned long long *ptr,unsigned long long old,unsigned long long new) { 无符号长长oldval; 无符号长解析; 预取(ptr); _...

回答 1 投票 0

确保 clang-cl 中自定义 ASM 函数的 x64 合规性

对于我自定义编译的本机 x64 JIT 代码,我有某些固有函数。其中很多只是从我的代码中调用的,因此我将使用自己的编译器生成。然而,其中一些是可怕的......

回答 1 投票 0

如何使用名为 ptr 的变量解决 Visual Studio 中的 C2400 错误?

我正在使用与块 _asm {} 集成的 x86 汇编语言进行 C++ 编程,但我一直遇到相同的错误 C2400。 我正在尝试计算前 n 个素数。 错误:C2400 装配错误...

回答 1 投票 0

汇编代码有错误运行时检查失败

我遇到运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用用一个函数调用约定声明的函数的结果...

回答 1 投票 0

我的汇编语言代码哪里可能有错误

我有一个在 C++ Visual Studio 中使用汇编器插入编写的程序。我想将其安排为 Visual Studio 中的汇编程序。我不明白为什么我数错了。我瘦了...

回答 1 投票 0

我可以修改gcc内联汇编中的输入操作数吗

我们知道,如果我将 %eax 设置为输入,那么我无法将其包含到破坏寄存器列表中。所以我的问题是,在没有任何内容的情况下修改汇编代码中 %eax 的值是否合法?

回答 1 投票 0

如何使用内联汇编将ID_AA64MMFR1_EL1寄存器的内容读取到64位变量中?

这是此答案的后续问题。 我正在尝试使用内联汇编将 ID_AA64MMFR1_EL1 寄存器的内容读入 64 位变量: #包括 #包括 这是this答案的后续问题。 我正在尝试使用内联汇编将 ID_AA64MMFR1_EL1 寄存器的内容读取到 64 位变量中: #include <stdio.h> #include <stdint.h> #include <inttypes.h> int main(void) { uint64_t foo; __asm volatile("mov %0, ID_AA64MMFR1_EL1" : "=r"(foo) ::); printf("%"PRIx64"\n", foo); } 注意:我需要读取 ID_AA64MMFR1_EL1 才能知道 AFP 字段的值。 但是,汇编器拒绝此代码: $ gcc t1b.c /tmp/ccTDGH7d.s: Assembler messages: /tmp/ccTDGH7d.s:22: Error: undefined symbol ID_AA64MMFR1_EL1 used as an immediate value 一个简单的问题:如何正确做? 如果您的程序在 EL0 上运行,您应该使用 hwcaps 中提供的 HWCAP_CPUID API - 更多详细信息,请参阅本文 ARM64 CPU 功能寄存器。请参阅此处了解工作示例代码。 mov助记符仅用于在通用和/或 FP/SIMD 寄存器(x0-x30、xzr、sp、q0-q31)之间移动,以及将立即值移动到通用寄存器中。移入和移出系统寄存器分别使用 msr 和 mrs。所以在这里你想要 mrs 而不是 mov。 请注意,从您的标头来看,您似乎是在普通用户空间 C 程序中执行此操作。在典型的操作系统上,用户空间运行在异常级别 0 (EL0)。但ID_AA64MMFR1_EL1名称上的EL1标签表明它只能在EL1及更高版本(即内核模式)下读取。所以执行这条指令会陷入陷阱。 某些操作系统可能通过模拟指令来处理陷阱。我知道 Linux 对某些功能 ID 寄存器执行此操作,但不记得这是否是其中之一。但是,在这种情况下,返回到程序的值不一定等于硬件实际返回的值。例如,操作系统可以屏蔽它不想让您知道的功能位。 在其他操作系统上(例如 MacOS,如果我没记错的话),你的程序会因 SIGILL 而死掉。 通常,操作系统会提供其他类似这样的CPU特性查询机制。例如,Linux 有 /proc/cpuinfo,MacOS 有 sysctl。

回答 2 投票 0

在 aarch64 上使用 asm!("mov...") 编译错误

我正在 Mac/aarch64 上运行书中的代码示例,并收到编译错误。 fn 解引用(ptr: *const usize) -> usize { 让 mut res: 使用; 不安全{ asm!(“移动...

回答 2 投票 0

Rust:使用 asm 编译错误!("mov... 在 aarch64 上

我正在 Mac/aarch64 上运行书中的代码示例,并收到编译错误。 fn 解引用(ptr: *const usize) -> usize { 让 mut res: 使用; 不安全{ asm!(“移动...

回答 1 投票 0

如何在 C++ 中使用内联汇编将两个大小矩阵相乘

我用 C++ 编写了这段代码,并使用内联汇编 _asm 进行方阵乘法。 #包括 使用命名空间 std; int main() { 整数 n = 2; int A[2][2] = { {1, 2}, {3, 4} }...

回答 1 投票 0

ARM中有与rdtsc等效的指令吗?

对于我的项目,我必须使用内联汇编指令(例如rdtsc)来计算某些C/C++指令的执行时间。 以下代码似乎适用于 Intel,但不适用于 ARM 处理器...

回答 3 投票 0

如何求汇编中偶数之和?

我正在自学组装。我想求偶数之和。但是,它不起作用,我不明白为什么,它没有显示任何错误。 我的代码如下 移动ebx,0; 移动...

回答 3 投票 0

汇编 - 除了 C 和 C++ 之外,还有其他语言允许使用内联代码与汇编进行交互吗?

我最近读了这篇题为“嵌入式系统/混合 C 和汇编编程”的文档 它基本上涉及 C 和 C++ 如何允许用户通过称为内联汇编的技术使用汇编代码

回答 2 投票 0

使用内联汇编器读取 GPR

我正在使用 PowerPC 的 Diab C 编译器 (v5.9.4),我需要将通用寄存器的内容复制到函数的局部变量中。 有没有关于如何读取 GPR 的示例...

回答 1 投票 0

汇编和模板类

我正在开发一个小项目,并尝试将一些硬编码值用于内联汇编。为此,我使用模板。我创建了一个代码片段来显示我所看到的 #包括 我正在开发一个小项目,并尝试将一些硬编码值用于内联汇编。为此,我使用模板。我创建了一个代码片段来显示我所看到的 #include <iostream> template <size_t T> struct MyClass { size_t myValue = T; void doSomething() { size_t value = T; __asm { mov eax, [T] mov [value], eax } std::cout << value << std::endl; } }; int main() { auto o = new MyClass<999>(); o->doSomething(); return 0; } 事实证明,对于汇编代码,它试图使用数据段而不是“直接将数字粘贴到那里” ; 25 : { push ebp mov ebp, esp push ecx ; 26 : auto o = new MyClass<999>(); push 4 call ??2@YAPAXI@Z ; operator new add esp, 4 ; 14 : size_t value = T; mov DWORD PTR _value$2[ebp], 999 ; 000003e7H ; 26 : auto o = new MyClass<999>(); mov DWORD PTR [eax], 0 mov DWORD PTR [eax], 999 ; 000003e7H ; 15 : __asm ; 16 : { ; 17 : mov eax, [T] mov eax, DWORD PTR ds:0 ; 18 : mov [value], eax mov DWORD PTR _value$2[ebp], eax ; 19 : } ; 20 : std::cout << value << std::endl; 我正在使用 Visual Studio 2015。还有其他方法可以实现此目的吗? 啊,多么可爱又扭曲的问题啊! 我尝试使用 T 初始化 constexpr 变量。结果是相同的 - 从内存加载值。宏可用于将文字传递给内联汇编,但它们与模板不能很好地混合。 使用 T 在类中初始化枚举在理论上应该可行(https://msdn.microsoft.com/en-us/library/ydwz5zc6.aspx提到枚举可以在内联汇编中使用),但是在内联汇编使 Visual Studio 2015 编译器崩溃:-)。 似乎有效的是一个函数模板,它使用模板参数声明一个枚举,然后在内联程序集中使用该枚举。如果必须将其放在模板类中,则可以在类中实例化模板函数,如下所示: #include <iostream> template <size_t T> void dosomething() { enum { LOCALENUM = T }; size_t value = 0; __asm { mov eax, LOCALENUM mov[value], eax } std::cout << value << std::endl; } template <size_t T> struct MyClass { size_t myValue = T; void doSomething() { ::dosomething<T>(); } }; int main() { //dosomething<999>(); auto o = new MyClass<999>(); o->doSomething(); return 0; } 这会产生以下汇编代码: auto o = new MyClass<999>(); 001B1015 mov dword ptr [eax],0 001B101B mov dword ptr [eax],3E7h o->doSomething(); 001B1021 mov eax,3E7h <--- Victory! 001B1026 mov dword ptr [ebp-4],eax 001B1029 mov ecx,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (01B2048h)] 001B102F push offset std::endl<char,std::char_traits<char> > (01B1050h) 001B1034 push dword ptr [ebp-4] 001B1037 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (01B2044h)]

回答 1 投票 0

SIGSYS 错误系统调用(Android)

我正在为 Android 编写一些内联汇编代码,在 x64 Android 模拟器中使用 GDB 逐步执行代码时,我看到我尝试执行的系统调用出现了 SIGSYS Bad System Call 错误。我

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.