0x0000000000400448 <main+0>: push %rbp 0x0000000000400449 <main+1>: mov %rsp,%rbp 0x000000000040044c <main+4>: mov $0x6,%eax 0x0000000000400451 <main+9>: leaveq 0x0000000000400452 <main+10>: retq 我试过了: breaki 0x0000000000400448 但似乎没有这样的命令。 gdb是否有这样的function?
Assembly下面是否有编程语言?
我发现了一个叫IACA(英特尔架构代码分析器)的有趣而强大的工具,但是我很难理解它。 我该怎么做,它有什么限制,我怎么能: 用它来分析C或C ++中的代码? 用它来分析x86汇编中的代码?
我做了一些研究。 一个字节是8位,一个字是可以在存储器上寻址的最小单位。 一个字的确切长度是变化的。 我不明白的是有一个字节是什么意思? 为什么不说8位? 我问了一个教授这个问题,他说现在大多数机器都是可以字节寻址的,但是这会产生什么呢?
我有一个问题,所有的硬核低级黑客在那里。 我在博客中碰到了这个句子。 我真的不认为这个来源很重要(如果你真的关心,那就是哈克),因为这似乎是一个普遍的说法。 例如,许多现代3D游戏都有用C ++和Assembly编写的高性能核心引擎。 就assembly而言 – 是用汇编编写的代码,因为你不希望编译器发出额外的指令或使用过多的字节,或者你使用了更好的algorithm,而这些algorithm在C中不能expression(或者不能用编译器把他们扼杀起来)? 我完全明白,理解低层次的东西是很重要的。 我只是想了解为什么在程序集合了解之后。
我正在GDB中进行一些汇编级别的debugging。 有没有办法让GDB以显示当前源代码行的相同方式显示当前汇编指令? 每个命令之后的默认输出如下所示: 0x0001433f 990 Foo::bar(p); 这给了我当前指令的地址,但是我必须继续参考disassemble的输出来看看我正在执行哪条指令。
如何编程日常机器(不是像电器,数字手表等那么多的电脑和移动设备)? 什么样的代码进入可口可乐自动售货机的编程? 我的咖啡机如何接受预定的时间,并在几小时后开始酝酿一壶咖啡? 这些机器是否有操作系统,还是更基础? 他们是用汇编,C还是其他语言编写的? 而且,我真的很想find一些列出这些操作系统或底层代码系统的资源,如果可能的话,甚至可以使用源代码。 如果有人知道这样的资源(search什么都没有给我),那将是太棒了。
如何在现代的x86-64 Intel CPU上实现4个浮点运算(双精度)的理论峰值性能? 据我所知,在大多数现代英特尔CPU上,需要三个周期才能完成SSE add和五个周期的完成(例如参见Agner Fog的“指令表” )。 由于stream水线化,如果algorithm至less有三个独立的求和,每个周期可以获得一个add的吞吐量。 由于对于打包的addpd以及标量addsd版本是正确的,SSE寄存器可以包含两个double ,所以每个周期的吞吐量可以高达两个触发器。 此外,似乎(虽然我还没有看到任何适当的文件) add的和mul可以并行执行,给出了每个周期四个触发器的理论最大吞吐量。 但是,我还没有能够用一个简单的C / C ++程序复制这个性能。 我最好的尝试导致了大约2.7次触发/周期。 如果任何人都可以贡献一个简单的C / C ++或汇编程序来演示高性能,那将是非常感谢。 我的尝试: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <sys/time.h> double stoptime(void) { struct timeval t; gettimeofday(&t,NULL); return (double) t.tv_sec + t.tv_usec/1000000.0; } double addmul(double add, double mul, int ops){ // Need to initialise differently […]
我正在读一本书,作者说if( a < 901 )比if( a <= 900 )快。 与这个简单的例子不完全一样,但是在复杂的循环代码上有一些性能改变。 我想这个必须用生成的机器代码来做,以防万一。
目标代码,机器代码和汇编代码有什么区别? 你能举一个他们区别的视觉例子吗?