Tag: x86

gcc:命令行参数在汇编代码中引用不同

我习惯看到(约定(A))引用的命令行参数: pushl %ebp movl %esp, %ebp movl (%ebp), %eax # argc movl 4(%ebp), %ebx # pointer to argv[0] string movl 8($ebp), %ecx # pointer to argv[1] string 有时,我看到列表的偏移量为8,这不是(主要)问题。 我在程序中注意到的是这个翻译和引用,我很困惑,得到argv[1] (约定(B)): movl 0xc(%ebp), %eax # pointer to a pointer to argv[0] (argc is at offset 8) addl $0x4, %eax # argv[1] is a pointer at offset […]

SSE优化代码执行类似于普通版本

我想采取英特尔SSE的第一步,所以我按照这里发布的指南,区别在于我不是为Windows和C ++开发,而是为Linux和C开发(因此我不使用任何_aligned_malloc而是posix_memalign )。 我还实现了一种计算密集型方法,而没有使用SSE扩展。 令人惊讶的是,当我运行程序时,两段代码(一台SSE和一台没有)需要花费相同的时间来运行,通常是使用SSE的时间略高于另一段。 这是正常的吗? GCC是否可能已经使用SSE优化(也使用-O0选项)? 我也尝试过-mfpmath=387选项,但没办法,仍然是一样的。

一些mandelbrot绘制例程从c到sse2

我想重写这样简单的例程到SSE2代码,(最好是在nasm中)我并不完全确定如何做,两件事情不清楚(如何表达计算(内循环和那些来自外循环)以及如何调用c代码函数“SetPixelInDibInt(i,j,palette [n]);”来自staticaly链接的asm代码 void DrawMandelbrotD(double ox, double oy, double lx, int N_ITER) { double ly = lx * double(CLIENT_Y)/double(CLIENT_X); double dx = lx / CLIENT_X; double dy = ly / CLIENT_Y; double ax = ox – lx * 0.5 + dx * 0.5; double ay = oy – ly * 0.5 + dy * 0.5; static […]

如何编写内联gnu扩展程序集的短块来交换两个整数变量的值?

为了娱乐,我正在使用带有32位Linux目标的x86的AT&T语法学习gnu扩展汇编。 我花了最后三个小时编写了两个可能的解决方案来解决我交换两个整数变量a和b的值的挑战,我的解决方案都没有完全解决我的问题。 首先,让我们更详细地看一下我的TODO障碍: int main() { int a = 2, b = 1; printf(“a is %d, b is %d\n”, a, b); // TODO: swap a and b using extended assembly, and do not modify the program in any other way printf(“a is %d, b is %d\n”, a, b); } 在阅读本HOWTO之后 ,我编写了以下内联扩展汇编代码。 这是我第一次尝试交换整数: asm volatile(“movl %0, […]

Websocket数据取消屏蔽/多字节xor

websocket规范将unmasking数据定义为 j = i MOD 4 transformed-octet-i = original-octet-i XOR masking-key-octet-j 其中mask是4个字节长,每个字节必须应用unmasking。 有没有办法更有效地做到这一点,而不仅仅是循环字节? 运行代码的服务器可以假定为Haswell CPU,OS是内核> 3.2的Linux,因此SSE等都存在。 编码是在C语言中完成的,但如果需要,我也可以执行asm。 我试图自己查找解决方案,但是无法弄清楚是否有任何SSE1-5 / AVE /中的任何一个都有适当的指令(无论多少扩展 – 多年来失去了很多轨道) 非常感谢你! 编辑:重新阅读规范几次之后,似乎它实际上只是用掩码字节对数据字节进行异或,我可以一次做8个字节,直到最后几个字节。 问题仍然存在,因为我认为可能仍然有一种方法可以使用SSE等来优化它(可能一次只处理16个字节?让进程执行for循环?…)

使用FPU和C内联汇编

我写了一个像这样的矢量结构: struct vector { float x1, x2, x3, x4; }; 然后我创建了一个函数,它使用向量使用内联汇编执行一些操作: struct vector *adding(const struct vector v1[], const struct vector v2[], int size) { struct vector vec[size]; int i; for(i = 0; i < size; i++) { asm( "FLDL %4 \n" //v1.x1 "FADDL %8 \n" //v2.x1 "FSTL %0 \n" "FLDL %5 \n" //v1.x2 "FADDL %9 […]

为什么这个IA32汇编代码有三个leal指令?

我编译了这个C函数: int calc(int x, int y, int z) { return x + 3*y + 19*z; } 我在calc.s中得到了这个,我正在注释正在发生的事情: .file “calc.c” .text .globl calc .type calc, @function calc: pushl %ebp //Save paramaters movl %esp, %ebp //Move stack pointer into %ebp movl 12(%ebp), %eax //Move y into %eax movl 16(%ebp), %ecx //Move z into %ecx leal (%eax,%eax,2), %eax […]

为什么明确的interrput标志导致C中的分段错误?

我正在学习关于Assembly和C.的一些基础知识用于学习目的我决定编写一个禁用Interrupts的简单程序,当用户想要在控制台中键入内容时他/她不能: #include int main(){ int a; printf(“enter your number : “); asm (“cli”); scanf(“%d”, &a); printf(“your number is %d\n” , a); return 0; } 但是当我用GCC编译它时,我得到了分段错误: Segmentation fault (core dumped) 当我用gdb调试它时,当程序到达asm(“cli”);时,我收到了这条消息asm(“cli”); 线: Program received signal SIGSEGV, Segmentation fault. main () at cli.c:6 6 asm (“cli”);

从C程序读取标志寄存器

为了好奇,我试图读取标志寄存器并以一种很好的方式将其打印出来。 我已经尝试使用gcc的asm关键字阅读它,但我无法让它工作。 任何提示怎么做? 我正在运行Intel Core 2 Duo和Mac OS X.以下代码就是我所拥有的。 我希望能告诉我是否发生溢出: #include int main (void){ int a=10, b=0, bold=0; printf(“%d\n”,b); while(1){ a++; __asm__ (“pushf\n\t” “movl 4(%%esp), %%eax\n\t” “movl %%eax , %0\n\t” :”=r”(b) : :”%eax” ); if(b!=bold){ printf(“register changed \n %d\t to\t %d”,bold , b); } bold = b; } } 这给出了分段错误。 当我运行gdb时,我得到了这个: Program received signal EXC_BAD_ACCESS, […]

我正在编写自己的JIT解释器。 如何执行生成的指令?

我打算编写自己的JIT解释器作为VM课程的一部分。 我对高级语言,编译器和解释器有很多了解,但很少或根本没有关于x86汇编(或C)的知识。 实际上我不知道JIT是如何工作的,但这是我对它的看法:用一些中间语言读入程序。 将其编译为x86指令。 确保最后一条指令返回到VM代码中的某个地方。 将指令存储在内存中的某些位置。 无条件跳转到第一条指令。 瞧! 所以,考虑到这一点,我有以下小C程序: #include #include #include int main() { int *m = malloc(sizeof(int)); *m = 0x90; // NOP instruction code asm(“jmp *%0” : /* outputs: */ /* none */ : /* inputs: */ “d” (m) : /* clobbers: */ “eax”); return 42; } 好的,所以我的目的是让这个程序将NOP指令存储在内存中的某个位置,跳转到该位置然后可能崩溃(因为我没有设置任何方式让程序返回到main)。 问题:我是走在正确的道路上吗? 问题:你能告诉我一个经过修改的程序,它可以找到回到main中某个地方的方法吗? 问题:我应该注意的其他问题? PS:我的目标是获得理解,而不是以正确的方式做所有事情。 感谢所有的反馈。 […]