Tag: x86

如何从内联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 == […]

理解一些汇编语句的目的

我试图了解一些汇编代码并设法完成大部分汇编代码,除了几行。 我能够理解大部分内部发生的事情,但是我无法完全理解在代码的开头和结尾发生了什么(及其原因)。 有人可以对此有所了解吗? 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 […]

展开循环并使用矢量化进行独立求和

对于以下循环,如果我告诉它使用关联数学,例如使用-Ofast GCC将仅对循环进行矢量化。 float sumf(float *x) { x = (float*)__builtin_assume_aligned(x, 64); float sum = 0; for(int i=0; i<2048; i++) sum += x[i]; return sum; } 这是带-Ofast -mavx的程序集 sumf(float*): vxorps %xmm0, %xmm0, %xmm0 leaq 8192(%rdi), %rax .L2: vaddps (%rdi), %ymm0, %ymm0 addq $32, %rdi cmpq %rdi, %rax jne .L2 vhaddps %ymm0, %ymm0, %ymm0 vhaddps %ymm0, %ymm0, %ymm1 […]

x86转换为小写程序集

该程序将char指针转换为小写。 我正在使用Visual Studio 2010。 这是另一个问题,但更简单易读,更直接。 int b_search (char* token) { __asm { mov eax, 0 ; zero out the result mov edi, [token] ; move the token to search for into EDI MOV ecx, 0 LOWERCASE_TOKEN: ;lowercase the token OR [edi], 20h INC ecx CMP [edi+ecx],0 JNZ LOWERCASE_TOKEN MOV ecx, 0 在我的OR指令中,我试图将包含地址的寄存器更改为全部小写,我一直得到未处理的exception…访问冲突,没有括号什么,我没有得到错误但没有变得更低。 任何建议? 这是另一个问题的一些更大的代码的一部分,但我把它分解了,因为我只需要这个解决方案。

找出最少3个数字的最快方法?

在我写的一个程序中,在这个例程中,20%的时间用于在内循环中找出最少3个数字: static inline unsigned int min(unsigned int a, unsigned int b, unsigned int c) { unsigned int m = a; if (m > b) m = b; if (m > c) m = c; return m; } 有什么方法可以加快速度吗? 对于x86 / x86_64,我也可以使用汇编代码。 编辑:回复一些评论: *正在使用的编译器是gcc 4.3.3 *就集会而言,我只是初学者。 我在这里要求组装,学习如何做到这一点。 🙂 *我运行四核Intel 64,因此支持MMX / SSE等。 *这里很难发布循环,但我可以告诉你它是levenshtein算法的一个高度优化的实现。 这是编译器给我的非内联版本的min: .globl min […]

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:我正在运行一些性能测试,并希望确保处理器缓存的先前内容不会影响结果。

为什么将char传递给函数会改变它在c中的值?

我目前正在关注构建操作系统的这本工作簿 。 我的目的是编写一个64位内核。 在文本模式下,我已经加载了“内核”代码并将单个字符写入帧缓冲区。 当我通过将代码包装在函数中来添加一个间接级别来将单个字符写入帧缓冲区时,我的问题出现了。 看来传递给函数的char值在某种程度上被破坏了。 我有三个文件: bootloader.asm ; bootloader.asm [org 0x7c00] KERNEL_OFFSET equ 0x1000 mov bp, 0x9000 mov sp, bp ; load the kernel from boot disk mov bx, KERNEL_OFFSET mov dl, dl ; boot drive is set to dl mov ah, 0x02 ; bios read sector mov al, 15 ; read 15 sectors […]

从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 […]

如何在不触摸缓存的情况下写入或读取内存

有没有办法在不触及x86 CPU下的L1 / L2 / L3缓存的情况下写入/读取内存? 是否完全由硬件管理的x86 CPU缓存? 编辑:我想这样做,因为我想采样内存的速度,看看内存的任何部分性能是否下降。