Tag: 组件

如何在MIPS汇编中初始化一个巨大的数组?

例如,我正在尝试将C代码转换为等效的MIPS: int a[50]; int i; … a[0] = 1; a[1] = 1; … 看看其中一个答案 ,除此之外别无他法吗?: .data array: .word 1,1,…,0 (till the 50th zero)

计算32位数组的奇数位置中有多少1个

我正在实现一个简单的汇编函数,该函数通过c中的程序调用,以计算32位数组奇数位置中有多少1个。 传递给函数的第一个参数是指向数组的指针,第二个参数是元素的数量。 我不明白它无限循环的作用。 //汇编代码 .globl ones_in_odds .type ones_in_odds,@function ones_in_odds: pushl %ebp movl %esp,%ebp movl 8(%ebp),%ecx movl 12(%ebp),%esi #xorl %edi,%edi xorl %eax,%eax subl $-1,%esi startloop: cmpl $0,%esi jl endloop movl (%ecx,%esi,4),%edx xorl %edi,%edi innerloop: cmpl $16,%edi jg startloop shrl %edx shrl %edx adcl $00,%eax incl %edi jmp innerloop decl %esi jmp startloop endloop: movl %ebp,%esp popl […]

在C到MIPS程序集中编译代码

我写了一个C程序,我需要在MIPS汇编代码中看到它。 如何安装或运行将* .c文件作为* .txt或* .something_else以查看其MIPS汇编代码的软件? 我的操作系统是Linux。 非常感谢 !! BTW我的代码是: #include #include #include #define SIZE 128 int main () { char mychar , string [SIZE]; int i; int count =0 ; printf (“Please enter your string: \n\n”); fgets (string, SIZE, stdin); printf (“Please enter char to find: “); mychar = getchar(); for (i=0 ; string[i] != […]

GCCassembly优化 – 为什么这些相同?

我正在尝试学习assembly如何在初级阶段工作,所以我一直在玩gcc汇编的-S输出。 我写了一个简单的程序,定义了两个字节并返回它们的总和。 整个计划如下: int main(void) { char A = 5; char B = 10; return A + B; } 当我使用以下方法编译时没有优化: gcc -O0 -S -c test.c 我得到test.s,如下所示: .file “test.c” .def ___main; .scl 2; .type 32; .endef .text .globl _main .def _main; .scl 2; .type 32; .endef _main: LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 […]

GCC优化对比特操作的有效性

以下是在x86-64上设置C中的单个位的两种方法: inline void SetBitC(long *array, int bit) { //Pure C version *array |= 1<<bit; } inline void SetBitASM(long *array, int bit) { // Using inline x86 assembly asm("bts %1,%0" : "+r" (*array) : "g" (bit)); } 使用带有-O3 -march=core2选项的GCC 4.3,当使用常量bit时,C版本需要大约90%的时间 。 (两个版本编译为完全相同的汇编代码,除了C版本使用or [1<<num],%rax指令而不是bts [num],%rax指令) 与变量bit ,C版本表现更好,但仍然明显慢于内联汇编。 重置,切换和检查位具有类似的结果。 为什么GCC对这种常见操作的优化程度如此之差? 我是否在使用C版本做错了什么? 编辑:对不起,等待很长时间,这是我用来进行基准测试的代码。 它实际上是一个简单的编程问题… int main() { // Get […]

什么是DOS中字符表的内存地址?

DOS中字符表的地址是什么,我们可以通过操纵每个字符的像素来创建新的字体和符号? 我知道用BIOS中断来改变它,但是我只需要dos中字符表的内存地址来直接访问。

最少组装或编译至少三个值

我正在查看GCC-4.8为x86_64生成的代码,并想知道是否有更好(更快)的方法来计算三个值的最小值。 这是Python的集合模块的摘录,它计算m , rightindex+1和leftindex的最小值: ssize_t m = n; if (m > rightindex + 1) m = rightindex + 1; if (m > leftindex) m = leftindex; GCC使用CMOV生成连续相关的代码: leaq 1(%rbp), %rdx cmpq %rsi, %rdx cmovg %rsi, %rdx cmpq %rbx, %rdx cmovg %rbx, %rdx 是否有更快的代码可以通过删除数据依赖性来利用处理器无序并行执行? 我想知道是否存在用于计算多个值的最小值而不使用条件或谓词指令的已知技巧。 我也想知道是否有一些饱和的算术内在函数可以帮助解决这种情况。 EDITS: 如图所示,代码使用带符号的算术,但无符号算术答案也会有所帮助。 我询问了最少三个,但也对n最小的n感兴趣。 Linus对CMOV的警告: http : //ondioline.org/mail/cmov-a-bad-idea-on-out-of-order-cpus

通过分析程序集列表validationgcc / g ++中的编译器优化

我刚刚问了一个与编译器如何优化某些C ++代码有关的问题,我正在寻找有关如何validation编译器是否已执行某些优化的任何问题。 我试图查看用g ++( g++ -c -g -O2 -Wa,-ahl=file.s file.c )生成的汇编列表g++ -c -g -O2 -Wa,-ahl=file.s file.c什么,但输出太神秘了对我来说。 人们使用什么技术来解决这个问题,是否有任何关于如何解释优化代码的汇编列表或特定于GCC工具链的汇编列表来讨论这个问题的任何好的参考?

击败或满足OS X memset(和memset_pattern4)

我的问题是基于另一个SO问题: 为什么_mm_stream_ps会产生L1 / LL缓存未命中? 在读完它并被它吸引之后,我试图复制结果,看看自己哪个更快:天真循环,展开的幼稚循环, _mm_stream_ps (展开), _mm_stream_ps (展开)和最后但并非最memset_pattern4 。 (最后一个采用4字节模式,例如浮点数,并在目标数组上填充它,这应该与所有其他函数相同,但它可能是OS X独有的)。 我已确保将数组的开头对齐在高速缓存行(64字节,我检查过),并在参数中传递数组以及上一个问题中提到的任何其他性能调整。 有人想在gamedev上知道同样的事情: http ://www.gamedev.net/topic/532112-fast-memset/ 该线程的结论反映了我自己: 当目标arrays小于最大(L3)缓存时, _mm_store_ps比_mm_stream_ps快。 当目标数组较大时, _mm_stream_ps更快 。 我不完全确定为什么__mm_store_ps在第一种情况下更快,因为我从不在缓存中使用这些值,但我明白为什么_mm_stream_ps在后一种情况下胜出。 它适用于这种情况:将字节写入内存,您不需要立即(或永远)。 以下是目标数组比L3缓存大256倍(在我的情况下,1.5GB),使用gcc 4.8编译的结果: gcc-4.8 stream.c -o stream -std=c11 -O3 -g3 -ftree-vectorize -march=native -minline-all-stringops && ./stream bench L3-MASS, array 1610612736 bytes (402653184 floats, 0 remainder, 0x104803040 pointer) warm up round… 6% ( 20.81148 […]

为什么CPU在字边界上访问内存?

我听到很多数据应该在内存中正确对齐,以提高访问效率。 CPU访问内存在字边界上。 因此,在以下场景中,CPU必须进行2次内存访问才能获得单个字。 Supposing: 1 word = 4 bytes (“|” stands for word boundary. “o” stands for byte boundary) |—-o—-o—-o—-|—-o—-o—-o—-| (The word boundary in CPU’s eye) —-o—-o—-o—- (What I want to read from memory) 为什么会这样? 什么是CPU的根本原因只能读取字边界? 如果CPU只能访问4字节字边界,则地址线应仅需要30位,而不是32位宽。 因为CPU的眼中最后2位始终为0。 添加1 更重要的是,如果我们承认CPU必须读取字边界,为什么边界不能从我想要读取的地方开始? 似乎边界在CPU眼中是固定的。 添加2 根据AndreyT的说法 ,似乎边界设置是硬连线的,它是由内存访问硬件硬连线的。 就这一点而言,CPU是无辜的。 非常感谢…