Tag: assembly

是否可以将汇编指令放入CUDA代码中?

我想在CUDA C代码中使用汇编代码,以减少昂贵的执行,因为我们在c编程中使用asm 。 可能吗?

使用外部c代码编译asm引导加载程序

我在asm中编写了一个引导加载程序,并希望在我的项目中添加一些已编译的C代码。 我在这里创建了一个测试函数: test.c的 __asm__(“.code16\n”); void print_str() { __asm__ __volatile__(“mov $’A’ , %al\n”); __asm__ __volatile__(“mov $0x0e, %ah\n”); __asm__ __volatile__(“int $0x10\n”); } 这是asm代码(引导加载程序): hw.asm [org 0x7C00] [BITS 16] [extern print_str] ;nasm tip start: mov ax, 0 mov ds, ax mov es, ax mov ss, ax mov sp, 0x7C00 mov si, name call print_string mov al, ‘ ‘ […]

数学函数在现代处理器上花费了多少周期

我们知道现代处理器直接在处理器上执行诸如cosine和sin指令,因为它们具有操作码。 我的问题是这些指令通常需要多长时间。 他们是否需要恒定时间或依赖输入参数?

寻找最快的汉明距离C实现

我想找到两个等长的字符串有多少个不同的字符。 我发现xoring算法被认为是最快的,但它们返回以位表示的距离。 我希望结果以字符表示。 假设“pet”和“pit”的距离1以字符表示,但“e”和“i”可能有两个不同的位,因此xoring返回2。 我写的函数是: // na = length of both strings unsigned int HammingDistance(const char* a, unsigned int na, const char* b) { unsigned int num_mismatches = 0; while (na) { if (*a != *b) ++num_mismatches; –na; ++a; ++b; } return num_mismatches; } 会变得更快吗? 也许使用一些较低级别的命令或实现不同的算法? 系统:Intel Xeon X5650上的Gcc 4.7.2 谢谢

gcc内联ARM程序集中的`ldm / stm`

我正在尝试使用内联汇编创建一个ldm ( stm )指令,但是在表达操作数​​方面存在问题(特别是:它们的顺序)。 一件微不足道的事 void *ptr; unsigned int a; unsigned int b; __asm__(“ldm %0!,{%1,%2}” : “+&r”(ptr), “=r”(a), “=r”(b)); 不起作用,因为它可能会将r1和b放入r0 : ldm ip!, {r1, r0} ldm期望寄存器按升序排列(因为它们ldm编码)所以我需要一种方法来说明用于a的寄存器低于b的寄存器。 一个简单的方法是固定分配寄存器: register unsigned int a asm(“r0”); register unsigned int b asm(“r1”); __asm__(“ldm %0!,{%1,%2}” : “+&r”(ptr), “=r”(a), “=r”(b)); 但这会消除很多灵活性,并可能使生成的代码不是最佳的。 gcc(4.8)是否支持ldm/stm特殊约束? 或者,有更好的方法来解决这个问题(例如一些__builtin函数)? 编辑: 因为有建议使用“更高级别”的结构……我想解决的问题是32位32位字的打包(例如输入是8个字,输出是5个字)。 伪代码是 asm(“ldm %[in]!,{ %[a],%[b],%[c],%[d] }” …) asm(“ldm […]

GCC INLINE ASSEMBLY不会让我覆盖$ esp

我正在编写代码暂时使用我自己的堆栈进行实验。 当我使用文字内联汇编时,这很有效。 我将变量位置硬编码为ebp的偏移量。 但是,我希望我的代码可以在不使用硬编码内存地址的情况下工作,所以我一直在研究GCC的扩展内联汇编。 我所拥有的是以下内容: volatile intptr_t new_stack_ptr = (intptr_t) MY_STACK_POINTER; volatile intptr_t old_stack_ptr = 0; asm __volatile__(“movl %%esp, %0\n\t” “movl %1, %%esp” : “=r”(old_stack_ptr) /* output */ : “r”(new_stack_ptr) /* input */ ); 这一点是首先将堆栈指针保存到变量old_stack_ptr中。 接下来,堆栈指针(%esp)将被我在new_stack_ptr中保存的地址覆盖。 尽管如此,我发现GCC将%esp保存到old_stack_ptr中,但是没有用new_stack_ptr替换%esp。 经过深入检查,我发现它实际上扩展了我的程序集并添加了它自己的指令,如下所示: mov -0x14(%ebp),%eax mov %esp,%eax mov %eax,%esp mov %eax,-0x18(%ebp) 我认为GCC正试图保留%esp,因为我没有将它明确声明为“输出”操作数……我可能完全错了… 我真的很想使用扩展的内联汇编来实现这一点,因为如果没有,似乎我必须将%ebp的位置偏移“硬编码”到程序集中,我宁愿使用像这样的变量名。特别是因为这段代码需要在几个不同的系统上运行,这些系统似乎都以不同的方式抵消了我的变量,因此使用扩展的内联汇编可以让我明确地说出变量位置……但是我不明白它为什么会这样做额外的东西,不要让我像以前一样覆盖堆栈指针,自从我开始使用扩展程序集以来,它一直在这样做。 我感谢任何帮助!

ICC是否满足复数的乘法C99规范?

考虑这个简单的代码: #include complex float f(complex float x) { return x*x; } 如果使用英特尔编译器使用-O3 -march=core-avx2 -fp-model strict进行编译,则可以得到: f: vmovsldup xmm1, xmm0 #3.12 vmovshdup xmm2, xmm0 #3.12 vshufps xmm3, xmm0, xmm0, 177 #3.12 vmulps xmm4, xmm1, xmm0 #3.12 vmulps xmm5, xmm2, xmm3 #3.12 vaddsubps xmm0, xmm4, xmm5 #3.12 ret 这比你从gcc和clang获得的代码简单得多,而且比你在网上找到的用于乘以复数的代码简单得多。 例如,它没有明确地用于处理复杂的NaN或无穷大。 这个组件是否符合C99复数乘法的规范?

将C函数的值返回给ASM

我正试图从ASM中调用一个函数。 我知道如何调用它,但我很难找到如何获得此函数的返回值。 一个例子如下: C代码: int dummy() { return 5; } (N)ASM代码: dummyFunction: call dummy ;grab return into eax inc eax ; eax should be 6 now ret 有任何想法吗?

用ptrace解析调用和Ret。

我尝试使用ptrace解析可执行文件中的所有Calls和Rets。 符合x64opcode ,我找到了调用的操作码:0xe8和Rets:0xc3,0xc2,0xca,0xcb 。 自从我解析它们后,我发现了更多的Rets而不是Calls。 有我跟踪的程序: void func() { write(1, “i”, 1); } int main(int ac) { func(); return(0); } 有我的示踪剂: int tracer(t_info *info) { int status; long ptr; int ret = 0; int call = 0; waitpid(info->pid, &status, 0); while (WIFSTOPPED(status)) { ptrace(PTRACE_GETREGS, info->pid, NULL, info->regs); ptr = ptrace(PTRACE_PEEKDATA, info->pid, info->regs->rip); if (((ptr & […]

在ARM中是否有与rdtsc等效的指令?

对于我的项目, 我必须使用内联汇编指令 (如rdtsc)来计算某些C / C ++指令的执行时间。 以下代码似乎适用于英特尔,但不适用于ARM处理器: {unsigned a, d;asm volatile(“rdtsc” : “=a” (a), “=d” (d)); t0 = ((unsigned long)a) | (((unsigned long)d) << 32);} //The C++ statement to measure its execution time {unsigned a, d;asm volatile("rdtsc" : "=a" (a), "=d" (d)); t1 = ((unsigned long)a) | (((unsigned long)d) << 32);} time = t1-t0; 我的问题是: […]