Tag: 汇编

汇编语言如何工作?

我目前正试图理解堆栈是如何工作的,所以我决定教自己一些汇编语言 ,我正在使用这本书: http://savannah.nongnu.org/projects/pgubook/ 我正在使用Gas,并在Linux Mint上进行开发。 我有些困惑的东西: 据我所知,一个堆栈只是一个数据结构。 所以我认为如果我在汇编代码,我不得不自己实现堆栈。 然而,这似乎不是如此,因为有像这样的命令 pushl popl 所以当编译x86架构的程序集时,使用Gas语法:堆栈只是一个已经实现的数据结构? 还是实际上是在硬件层面上实现的? 或者是别的什么? 另外大多数其他芯片组的汇编语言已经实现了堆栈? 我知道这是一个愚蠢的问题,但我实际上很困惑。

本机代码,机器代码和汇编代码有什么区别?

我对机器代码和本机代码感到困惑。 这些有什么区别? 这些都一样吗?

在使用intel编译器的Windows和Linux之间的性能差异:看看程序集

我正在Windows和Linux(x86-64)上运行一个程序。 它使用相同的编译器(Intel Parallel Studio XE 2017)进行编译,其版本相同,Windows版本比Linux版本快3倍。 罪魁祸首是对std :: erf的调用,在英特尔math库中解决了这两种情况(默认情况下,它在Windows上静态链接,在Linux上静态链接,但在Linux上使用dynamic链接可提供相同的性能)。 这是一个简单的程序来重现问题。 #include <cmath> #include <cstdio> int main() { int n = 100000000; float sum = 1.0f; for (int k = 0; k < n; k++) { sum += std::erf(sum); } std::printf("%7.2f\n", sum); } 当我使用vTune来分析这个程序时,我发现程序集在Windows和Linux版本之间有点不同。 这是Windows上的呼叫站点(循环) Block 3: "vmovaps xmm0, xmm6" call 0x1400023e0 <erff> Block 4: inc […]

使用gdb在指定的可执行文件之外单步执行汇编代码会导致错误“找不到当前函数的范围”

我在gdb的目标可执行文件之外,我甚至没有对应于该目标的堆栈。 无论如何,我想要单步执行,这样我就可以validation我的汇编代码中发生了什么,因为我不是x86汇编的专家。 不幸的是,gdb拒绝做这个简单的汇编级debugging。 它允许我在适当的断点处设置和停止,但是一旦我尝试单步启动,gdb会报告错误“无法find当前函数的边界”,EIP不会改变。 额外细节: 机器代码是由gcc asm语句生成的,我将它从objdump -d的输出复制到执行的内核内存位置。 我不介意使用加载器将对象代码加载到重定位地址的简单方法,但请记住加载必须在内核模块中完成。 我想另外一个select是产生一个假的内核模块或debugging信息文件给gdb,使它相信这个区域在程序代码中。 gdb在内核可执行文件本身上工作正常。 (对于那些真正想知道的人,我在运行时将代码插入到VMware VM内的Linux内核数据空间中,并通过gdb从gdb远程debugging内核,通过VMware Workstation的内置gdb存根对其进行debugging。注意我没有编写内核利用;我是一个安全研究生写一个原型。) (我可以在我的程序集里面的每条指令上设置一个断点,这样做可能会花费一些时间,因为x86汇编指令的大小会有所不同,并且每次重启时程序集的位置都会改变。

什么是“代表” nop;“是指在x86程序集?

rep; nop什么? rep; nop意思? 这与pause指令是一样的吗? 它是否与rep nop (没有分号)相同? 简单的nop指令有什么区别? 它在AMD和Intel处理器上的performance有何不同? (奖金)这些说明的正式文件在哪里? 这个问题的动机 在对另一个问题的评论进行了一些讨论之后,我意识到我不知道是什么rep; nop; rep; nop; 是指在x86(或x86-64)程序集中。 而且我在网上找不到一个好的解释。 我知道rep是一个前缀,意思是“重复下一个指令cx次” (或者至less是在旧的16位x86汇编中)。 根据维基百科的这个汇总表 ,似乎rep只能用于movs , cmps , cmps , lods , scas (但是也许这个限制在更新的处理器上被删除了)。 因此,我认为rep nop (不用分号)会重复一次nop操作。 然而,经过进一步的search,我更加困惑。 rep; nop似乎是rep; nop rep; nop和pause 映射到完全相同的操作码 , pause有一点不同,只是nop行为。 2005年的一些旧邮件说了不同的事情: “尽量不要烧太多的权力” “这相当于只用2字节编码的”nop“。 “这是intel的魔法,它就像'但是让另一个HT兄弟运行'” “在intel和intel Athlon上快速填充是暂停的” 有了这些不同的意见,我不明白正确的意思。 它被用在Linux内核(在i386和x86_64上 )以及这个注释: /* REP NOP […]

为什么这个C ++程序非常快速?

我写了一个基准来比较Python,Ruby,JavaScript和C ++的不同解释器/编译器的性能。 正如所料,事实certificate,(优化后的)C ++击败了脚本语言,但是这样做的因素却非常高。 结果是: sven@jet:~/tmp/js$ time node bla.js # * JavaScript with node * 0 real 0m1.222s user 0m1.190s sys 0m0.015s sven@jet:~/tmp/js$ time ruby foo.rb # * Ruby * 0 real 0m52.428s user 0m52.395s sys 0m0.028s sven@jet:~/tmp/js$ time python blub.py # * Python with CPython * 0 real 1m16.480s user 1m16.371s sys 0m0.080s sven@jet:~/tmp/js$ […]

int运算符!=和==比较时为零

我发现!=和==不是testing零或非零的最快方法。 bool nonZero1 = integer != 0; xor eax, eax test ecx, ecx setne al bool nonZero2 = integer < 0 || integer > 0; test ecx, ecx setne al bool zero1 = integer == 0; xor eax, eax test ecx, ecx sete al bool zero2 = !(integer < 0 || integer > 0); test […]

“dword ptr”是什么意思?

有人可以解释这是什么意思? (Intel语法,x86,Windows) and dword ptr [ebp-4], 0

C代码循环的性能

这个问题在这里继续我的问题(根据神秘的build议): C代码循环的性能 继续我的问题,当我使用打包指令,而不是标量指令使用内在函数的代码看起来非常相似: for(int i=0; i<size; i+=16) { y1 = _mm_load_ps(output[i]); … y4 = _mm_load_ps(output[i+12]); for(k=0; k<ksize; k++){ for(l=0; l<ksize; l++){ w = _mm_set_ps1(weight[i+k+l]); x1 = _mm_load_ps(input[i+k+l]); y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1)); … x4 = _mm_load_ps(input[i+k+l+12]); y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4)); } } _mm_store_ps(&output[i],y1); … _mm_store_ps(&output[i+12],y4); } 这个内核的testing性能是每个周期大约5.6个FP操作,但是我认为它恰好是标量版本的4倍,即4.1,6 = 6,4个FP操作每个周期。 考虑到重量因素的移动(感谢指出),时间表看起来像: 它看起来像日程安排不会改变,虽然在movss操作之后有一个额外的指令,将标量权值移到XMM寄存器,然后使用shufps在整个vector中复制这个标量值。 考虑到从负载到浮点域的切换延迟时间,似乎权重vector已经准备好用于mulps ,所以这不应该引起任何额外的延迟。 在这个内核中使用的movaps (alignment的,压缩的移动), addps & mulps指令(用汇编代码检查)与标量版本具有相同的延迟和吞吐量,所以这不应该引起任何额外的延迟。 […]

为什么x86很丑? 与其他人相比,为什么被认为是劣等的?

最近我一直在阅读一些SO档案,并遇到了针对x86架构的声明。 为什么我们需要不同的CPU架构的服务器和迷你/大型机和混合核心? 说 “ PC架构是一团糟,任何OS开发者都会告诉你的。 学习汇编语言是否值得努力? ( 存档 )说 “ 意识到x86架构至多是可怕的 ” 学习x86汇编程序的简单方法是什么? 说 “ 大多数大学都会在像MIPS这样的东西上进行汇编,因为它比较容易理解,x86汇编真的很难看 ” 还有更多的评论 “与大多数架构相比,X86糟透了。” “ 这绝对是X86不如MIPS,SPARC和PowerPC的传统智慧 ” “ x86很难看 ” 我尝试search,但没有find任何理由。 我不认为x86可能是坏的,因为这是我熟悉的唯一架构。 有人可以友好地给我考虑x86相比其他人的丑陋/坏/劣等原因。