Tag: x86

测试两个__m128i变量之间的相等性

如果我想在两个__m128i变量之间进行逐__m128i测试,我是否需要使用SSE指令或者我可以使用== ? 如果没有,我应该使用哪条SSE指令?

如何制作一个可以运行x86hex代码的C程序

我有一个hex代码数组转换成汇编指令,我想在C中创建可以执行这些的程序。 unsigned char rawData[5356] = { 0x4C, 0x01, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x0C, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x2E, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x05, 0x00, 0x00, 0xA4, 0x01, 0x00, 0x00, 0x68, 0x08, 0x00, 0x00, 0x00, […]

英特尔Galileo裸机UART

我想在Intel Galileo板上编写一个“hello world” 裸机应用程序。 当然,使用UEFI打印文本(到UART-1)效果很好,但我想“手动”访问UART,而无需UEFI的任何帮助。 在QEMU,我的代码效果很好: .h文件 #define COM1_PORT (0x03F8) #define UART_PORT (COM1_PORT) enum uart_port_offs_t { // DLAB RW THR = 0, // 0 W Transmitter Holding Buffer RBR = 0, // 0 R Receiver Buffer DLL = 0, // 1 RW Divisor Latch Low Byte IER = 1, // 0 RW Interrupt Enable Register […]

涉及sin()的两个非常相似的函数表现出截然不同的性能 – 为什么?

考虑以下两个以两种不同方式执行相同计算的程序: // v1.c #include #include int main(void) { int i, j; int nbr_values = 8192; int n_iter = 100000; float x; for (j = 0; j < nbr_values; j++) { x = 1; for (i = 0; i < n_iter; i++) x = sin(x); } printf("%f\n", x); return 0; } 和 // v2.c #include #include […]

如何强制gcc直接在PIC代码中调用函数?

考虑以下function: extern void test1(void); extern void test2(void) { test1(); } 这是在amd64 Linux上没有-fpic生成的代码gcc: test2: jmp test1 当我使用-fpic编译时,gcc通过PLT显式调用以启用符号插入: test2: jmp test1@PLT 然而,对于与位置无关的代码并不严格需要,如果我不想支持,可以省略。 如有必要,链接器无论如何都会将跳转目标重写为PLT符号。 如何在不更改源代码且不使编译代码不适合共享库的情况下,使函数调用直接转到目标而不是通过PLT显式转换?

gcc删除内联汇编程序代码

似乎gcc 4.6.2删除了它认为从函数中未使用的代码。 test.c的 int main(void) { goto exit; handler: __asm__ __volatile__(“jmp 0x0”); exit: return 0; } main()拆卸 0x08048404 : push ebp 0x08048405 : mov ebp,esp 0x08048407 : nop # <– This is all whats left of my jmp. 0x08048408 : mov eax,0x0 0x0804840d : pop ebp 0x0804840e : ret 编译器选项 没有启用优化,只有gcc -m32 -o test test.c […]

浮点乘法执行速度较慢,具体取决于C中的操作数

我正在对以前从文件中读取的矩阵执行模板计算。 我使用两种不同的矩阵(NonZero类型和Zero类型)。 两种类型共享边界的值(通常为1000),而其余元素对于零类型为0,对于NonZero类型为1。 该代码将文件的矩阵存储在两个相同大小的分配矩阵中。 然后,它使用自己的值和邻居值(添加x 4和mul x 1)在一个矩阵的每个元素中执行操作,并将结果存储在第二个矩阵中。 一旦计算完成,交换矩阵的指针并且执行相同的操作有限次数。 在这里你有核心代码: #define GET(I,J) rMat[(I)*cols + (J)] #define PUT(I,J) wMat[(I)*cols + (J)] for (cur_time=0; cur_time<timeSteps; cur_time++) { for (i=1; i<rows-1; i++) { for (j=1; j<cols-1; j++) { PUT(i,j) = 0.2f*(GET(i-1,j) + GET(i,j-1) + GET(i,j) + GET(i,j+1) + GET(i+1,j)); } } // Change pointers for next iteration auxP […]

SSE(SIMD):通过标量乘以向量

我在程序中执行的常见操作是通过标量缩放矢量(V * s,例如[1,2,3,4] * 2 == [2,4,6,8])。 除了首先在向量中的每个位置加载标量(例如_mm_set_ps(2,2,2,2))然后相乘之外,是否有SSE(或AVX)指令来执行此操作? 这就是我现在所做的: __m128 _scalar = _mm_set_ps(s,s,s,s); __m128 _result = _mm_mul_ps(_vector, _scalar); 我在寻找像…… __m128 _result = _mm_scale_ps(_vector, s);

利用LDT(本地描述符表)

我试图使用除默认代码和数据用户和内核段之外的不同段进行一些实验。 我希望通过使用本地描述符表和modify_ldt系统调用来实现这一点。 通过系统调用,我在LDT中创建了一个新条目,它是一个段描述符,其基地址是我要“隔离”的全局变量,限制为4个字节。 我尝试通过C程序中的内联汇编将数据段寄存器与我的自定义LDT条目的段选择器一起加载,但是当我尝试访问变量时,我收到了分段错误。 我的怀疑是我的全局变量的偏移存在问题,并且在计算地址时,它超出了我的自定义段的限制,因此导致seg错误。 有谁知道这种情况的工作? 哦,顺便说一句,这是在Linux上的x86架构上。 这是我第一次在论坛上提出这样的问题,所以如果有任何其他信息可以certificate是有用的,请告诉我。 先感谢您。 编辑:我意识到我可能应该包含源代码:) struct user_desc* table_entry_ptr = NULL; /* Allocates memory for a user_desc struct */ table_entry_ptr = (struct user_desc*)malloc(sizeof(struct user_desc)); /* Fills the user_desc struct which represents the segment for mx */ table_entry_ptr->entry_number = 0; table_entry_ptr->base_addr = ((unsigned long)&mx); table_entry_ptr->limit = 0x4; table_entry_ptr->seg_32bit = 0x1; table_entry_ptr->contents = […]

GCC / X86,相对跳跃的问题

我试图在x86程序集中进行相对跳转,但是我无法让它工作。 似乎由于某种原因,我的跳跃不断被重写为绝对跳跃或其他东西。 我正在尝试做的一个简单的示例程序是: .global main main: jmp 0x4 ret 由于jmp指令长4个字节,相对跳转偏离跳转地址+ 1,因此这应该是一个奇特的无操作。 但是,编译和运行此代码将导致分段错误。 对我来说真正的益智之处在于将其编译到对象级别然后反汇编目标文件显示它看起来像汇编程序正确地执行相对跳转,但是在编译文件之后链接器将其更改为另一种类型的跳转。 例如,如果上面的代码位于名为asmtest.s的文件中: $gcc -c asmtest.s $objdump -D asmtest.o … Some info from objdump 00000000 : 0: e9 00 00 00 00 jmp 5 5: c3 ret 这看起来像汇编程序正确地进行了相对跳转,尽管jmp指令填充为0是可疑的。 然后我使用gcc链接它,然后反汇编它得到了这个: $gcc -o asmtest asmtest.o $objdump -d asmtest …Extra info and other disassembled functions 08048394 : […]