Tag: inline assembly

在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; 我的问题是: […]

奇怪的’asm’操作数有不可能的约束错误

我正在尝试编译一个简单的C程序(Win7 32位,Mingw32 Shell和GCC 5.3.0)。 C代码是这样的: #include #include #define _set_tssldt_desc(n,addr,type) \ __asm__ (“movw $104,%1\n\t” \ :\ :”a” (addr),\ “m” (*(n)),\ “m” (*(n+2)),\ “m” (*(n+4)),\ “m” (*(n+5)),\ “m” (*(n+6)),\ “m” (*(n+7))\ ) #define set_tss_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,”0x89″) char *n; char *addr; int main(void) { char *n = (char *)malloc(100*sizeof(int)); char *addr = (char *)malloc(100*sizeof(int)); set_tss_desc(n, addr); free(n); […]

ARM程序集:在重新加载’asm’时无法在类’GENERAL_REGS’中找到寄存器

我试图在ARM Cortex-a8上实现一个函数,该函数将32位操作数与ARM组件中的256位操作数相乘。 问题是我的寄存器用完了,我不知道如何减少这里使用的寄存器的数量。 这是我的function: typedef struct UN_256fe{ uint32_t uint32[8]; }UN_256fe; typedef struct UN_288bite{ uint32_t uint32[9]; }UN_288bite; void multiply32x256(uint32_t A, UN_256fe* B, UN_288bite* res){ asm ( “umull r3, r4, %9, %10;\n\t” “mov %0, r3; \n\t”/*res->uint32[0] = r3*/ “umull r3, r5, %9, %11;\n\t” “adds r6, r3, r4; \n\t”/*res->uint32[1] = r3 + r4*/ “mov %1, r6; \n\t” “umull […]

%C在GCC内联汇编代码中的含义是什么?

我试图理解这个来自_hypercall0内联汇编代码。 asm volatile (“call hypercall_page+%c[offset]” \ : “=r” (__res) \ : [offset] “i” (__HYPERVISOR_##name * sizeof(hypercall_page[0])) \ : “memory”, “edi”, “esi”, “edx”, “ecx”, “ebx”, “eax”) 我无法找到第一行中%c的含义的信息。 我没有在GCC手册最明显的部分找到任何信息,这解释了%[name] ,但没有找到%c[name] 。 还有其他我应该看的地方吗?

是否可以在C中访问32位寄存器?

是否可以在C中访问32位寄存器? 如果是,怎么样? 如果没有,那么有没有办法在C中嵌入汇编代码? 顺便说一下,我正在使用MinGW编译器。 提前致谢!

如何从内联asm访问C结构/变量?

请考虑以下代码: int bn_div(bn_t *bn1, bn_t *bn2, bn_t *bnr) { uint32 q, m; /* Division Result */ uint32 i; /* Loop Counter */ uint32 j; /* Loop Counter */ /* Check Input */ if (bn1 == NULL) return(EFAULT); if (bn1->dat == NULL) return(EFAULT); if (bn2 == NULL) return(EFAULT); if (bn2->dat == NULL) return(EFAULT); if (bnr == […]

英特尔的时间戳读取asm代码示例是否使用了两个以上的寄存器?

我正在研究使用x86 CPU中的时间戳寄存器(TSR)来测量基准性能。 它是一个有用的寄存器,因为它以单调时间单位测量,不受时钟速度变化的影响。 很酷。 这是一份英特尔文档,显示了使用TSR进行可靠基准测试的asm片段,包括使用cpuid进行管道同步。 见第16页: http://www.intel.com/content/www/us/en/embedded/training/ia-32-ia-64-benchmark-code-execution-paper.html 要读取开始时间,它说(我注释了一下): __asm volatile ( “cpuid\n\t” // writes e[abcd]x “rdtsc\n\t” // writes edx, eax “mov %%edx, %0\n\t” “mov %%eax, %1\n\t” // :”=r” (cycles_high), “=r” (cycles_low) // outputs : // inputs :”%rax”, “%rbx”, “%rcx”, “%rdx”); // clobber 我想知道为什么使用临时寄存器来获取edx和eax的值。 为什么不删除mov并从edx和eax读取TSR值? 像这样: __asm volatile( “cpuid\n\t” “rdtsc\n\t” // : “=d” (cycles_high), “=a” (cycles_low) […]

在C / C ++中使用内联汇编

我正在尝试使用内联汇编…我读过这个页面http://www.codeproject.com/KB/cpp/edujini_inline_asm.aspx但我无法理解传递给我的函数的参数。 我正在写一个C写的例子..这是我的函数头: write2(char *str, int len){ } 这是我的汇编代码: global write2 write2: push ebp mov ebp, esp mov eax, 4 ;sys_write mov ebx, 1 ;stdout mov ecx, [ebp+8] ;string pointer mov edx, [ebp+12] ;string size int 0x80 ;syscall leave ret 我该怎么做才能将代码传递给C函数…我正在做这样的事情: write2(char *str, int len){ asm ( “movl 4, %%eax;” “movl 1, %%ebx;” “mov %1, %%ecx;” […]