Tag: 程序集

将参数从C传递给汇编?

如何将参数从C main函数传递给汇编函数? 我知道我的自定义函数必须看起来像: void function(char *somedata) __attribute__((cdecl)); 现在我如何在汇编文件中使用somedata 。 我的操作系统是Linux Ubuntu,我的处理器是x86。

x86上交换与比较和交换锁的相对性能

两种常见的锁定习语是: if (!atomic_swap(lockaddr, 1)) /* got the lock */ 和: if (!atomic_compare_and_swap(lockaddr, 0, val)) /* got the lock */ 其中val可以简单地为锁的新预期所有者的常量或标识符。 我想知道的是x86(和x86_64)机器上两者之间是否存在任何显着的性能差异。 我知道这是一个相当广泛的问题,因为单个cpu模型之间的答案可能差异很大,但这是我要求的原因之一,而不仅仅是我可以访问的几个cpus的基准测试。

为什么树矢量化使这种排序算法慢2倍?

如果在gcc(4.7.2)中启用-fprofile-arcs则此问题的排序算法会快两倍(!)。 该问题的大量简化的C代码(事实certificate我可以用全零来初始化数组,奇怪的性能行为仍然存在,但它使得推理更加简单): #include #include #define ELEMENTS 100000 int main() { int a[ELEMENTS] = { 0 }; clock_t start = clock(); for (int i = 0; i < ELEMENTS; ++i) { int lowerElementIndex = i; for (int j = i+1; j < ELEMENTS; ++j) { if (a[j] < a[lowerElementIndex]) { lowerElementIndex = j; } } int […]

理解一些汇编语句的目的

我试图了解一些汇编代码并设法完成大部分汇编代码,除了几行。 我能够理解大部分内部发生的事情,但是我无法完全理解在代码的开头和结尾发生了什么(及其原因)。 有人可以对此有所了解吗? int main() { int a, b; a = 12; b = 20; b = a + 123; return 0; } 拆卸版本: 8048394:8d 4c 24 04 lea 0x4(%esp),%ecx ; ?? 8048398:83 e4 f0 and $0xfffffff0,%esp ; ?? 804839b:ff 71 fc pushl -0x4(%ecx) ; ?? 804839e:55 push %ebp ; Store the Base pointer 804839f:89 […]

WBINVD指令用法

我正在尝试在linux上使用WBINV指令来清除处理器的L1缓存。 以下程序编译,但在我尝试运行它时会产生分段错误。 int main() {asm (“wbinvd”); return 1;} 我正在使用gcc 4.4.3并在我的x86机器上运行Linux内核2.6.32-33。 处理器信息:Intel(R)Core(TM)2 Duo CPU T5270 @ 1.40GHz 我按如下方式构建了程序: $ gcc $ ./a.out 分段故障 有人能告诉我我做错了什么吗? 我如何让它运行? PS:我正在运行一些性能测试,并希望确保处理器缓存的先前内容不会影响结果。

来自数组0初始化的奇怪组件

灵感来自c / c ++中初始化和归零数组的问题? 我决定实际检查一下针对Windows Mobile Professional(ARM处理器,来自Microsoft Optimizing Compiler)的优化发布版本的程序集。 我发现的有点令人惊讶,我想知道是否有人可以解释我的问题。 检查这两个例子: byte a[10] = { 0 }; byte b[10]; memset(b, 0, sizeof(b)); 它们在同一个函数中使用,因此堆栈如下所示: [ ] // padding byte to reach DWORD boundary [ ] // padding byte to reach DWORD boundary [ ] // b[9] (last element of b) [ ] [ ] [ ] […]

从c调用汇编函数

我试图从c调用汇编函数,但我不断收到错误。 .text .globl integrate .type integrate, @function integrate: push %ebp mov %esp, %ebp mov $0,%edi start_loop: cmp %edi,1024 je loop_exit mov 8(%ebp),%eax mov 12(%ebp),%ecx sub %eax,%ecx add %edi,%ecx incl %edi jmp start_loop loop_exit: movl %ebp, %esp popl %ebp ret 这是我的汇编函数,名为integrate.s的文件。 #include extern int integrate(int from,int to); void main() { printf(“%d”,integrate(1,10)); } inheritance人我的代码。 function.c:5:6: warning: return […]

从x86汇编语言调用C函数

是否可以使用GCC从C函数生成汇编语言函数,以便可以从汇编语言程序调用它们? 我知道gcc将C编译为机器代码(很容易被反汇编成汇编语言),我已经知道可以在C中内联汇编语言函数 ,但我还没有找到一种方法从汇编中调用C函数语言程序,基本上与此相反。 在这里,我试图在x86汇编程序中内联一个C函数。 如果无法内联,那么还有其他方法可以从汇编语言程序中调用C函数吗? .686p .model flat,stdcall .stack 2048 .data .code start: invoke ExitProcess, 0 printSomething PROC ;now I’m attempting to inline a C function here void printSomething(thingToPrint){ printf(“This is a C function that I want to invoke from an assembly language program.”); printf(“There must be some way to do this – is it […]

如何“转到”c中的不同function?

基本上我试图在C中模拟汇编代码。 这是C代码: int main() { test(); main_next: printf(“Hello, World!”); } void test() { goto main_next; } 尝试编译此代码(Linux 32位,gcc 4.6.3),我收到此错误: error: label ‘main_randomtag_next’ used but not defined 有谁知道如何在C中进行这种程序间的转换? 谢谢!

如何在GCC内联汇编中使用标签?

我正在尝试学习x86-64内联汇编并决定实现这个非常简单的交换方法,只需按升序排序a和b : #include void swap(int* a, int* b) { asm(“.intel_syntax noprefix”); asm(“mov eax, DWORD PTR [rdi]”); asm(“mov ebx, DWORD PTR [rsi]”); asm(“cmp eax, ebx”); asm(“jle .L1”); asm(“mov DWORD PTR [rdi], ebx”); asm(“mov DWORD PTR [rsi], eax”); asm(“.L1:”); asm(“.att_syntax noprefix”); } int main() { int input[3]; scanf(“%d%d%d”, &input[0], &input[1], &input[2]); swap(&input[0], &input[1]); swap(&input[1], &input[2]); swap(&input[0], &input[1]); […]