Tag: 汇编

x86汇编寄存器中使用的push / pop指令的function是什么?

在阅读汇编程序时,我经常遇到一些人,他们会推送一个处理器的某个寄存器,稍后再popup来恢复它以前的状态。 你怎么能推注册? 它在哪里推? 为什么这需要? 这是归结为一个单一的处理器指令还是更复杂?

rdtscp,rdtsc:memory和cpuid / rdtsc之间的区别?

假设我们正在尝试使用tsc进行性能监视,并且我们希望阻止指令重新sorting。 这些是我们的select: 1: rdtscp是一个序列化调用。 它阻止了对rdtscp调用的重新sorting。 __asm__ __volatile__("rdtscp; " // serializing read of tsc "shl $32,%%rdx; " // shift higher 32 bits stored in rdx up "or %%rdx,%%rax" // and or onto rax : "=a"(tsc) // output to tsc variable : : "%rcx", "%rdx"); // rcx and rdx are clobbered 但是, rdtscp仅适用于较新的CPU。 所以在这种情况下,我们必须使用rdtsc 。 但rdtsc是非序列化的,所以单独使用它不会阻止CPU对其进行重新sorting。 所以我们可以使用这两个选项来防止重新sorting: […]

学习汇编 – 我应该从32位还是64位开始?

我真的想学汇编。 我非常擅长c / c ++,但是希望能够更好地理解更低级别的情况。 我意识到,汇编相关的问题之前已经被问到,但我只是寻找一些特定于我的情况的方向: 我正在运行Windows 7,并且对我应该如何开始使用程序集进行混淆。 我是否必须从x64开始,因为我正在运行Windows 7? 有人说“先从32位开始” – 我该怎么做呢? 我的操作系统与编写“32”或“64”位程序集的能力有什么关系? 事实上,'n bit'组件是什么意思,其中n是一个数字? 编辑: 以下是一些帮助我开始assembly的链接; 其他刚刚入门的人可能会发现他们有帮助。 我将继续更新这个列表,因为我继续我的程序集:) 注意:正如我一直在学习,我决定把重点放在用masm32编程。 所以下面的大部分资源都是关注的。 x86 标记wiki (初学者指南,参考手册,ABI文档等)。 www.masm32.com X86大会WikiBook X86反汇编WikiBook (很好理解一些约定,以及如何将高级代码翻译成汇编的基础知识) WinAsm IDE (与masm32很好地搭配) 简介:Windows汇编 (所有代码示例均适用于masm32) 中断列表 汇编教程 (非常适合帮助理解核心概念) x86汇编指南 Agner Fog的软件优化资源 ,包括一些关于在不同平台(Windows与Linux / OS X)上调用约定的好东西,以及大量关于如何有效地完成特定事情的例子。 对于初学者来说不是很好,但是对于中级到高级的读者来说非常好。 (对于英特尔和AMD处理器的每条指令,他也有详细的性能信息,对于严格的性能微型优化非常有用。有些初学者可能想看看其中的一些,开始思考CPU如何工作,以及为什么你可以做一些而不是另一个。)

我可以在GCC上使用x86汇编语言吗?

我想写一个小的低级程序。 对于它的某些部分,我将需要使用汇编语言,但其余的代码将写在C / C + +。 因此,如果我将使用GCC将C / C ++与汇编代码混合,是否需要使用AT&T语法,还是可以使用Intel语法? 或者你如何以其他方式混合使用C / C ++和asm(intel语法)? 我意识到,也许我没有select,必须使用AT&T的语法,但我想确定.. 如果没有select,我可以在哪里find有关AT&T语法的完整/官方文档? 谢谢!

最快的方法来计算一个128位整数模64位整数

我有一个128位无符号整数A和一个64位无符号整数B.计算A % B的最快方法是什么?这是将A除以B得到的(64位)余数? 我正在寻找以C或汇编语言来做到这一点,但我需要针对32位的x86平台。 这不幸意味着我不能利用128位整数的编译器支持,也不能利用x64体系结构在单个指令中执行所需操作的能力。 编辑: 感谢您迄今的答复。 但是,在我看来,推荐的algorithm会非常慢 – 不是执行128位乘64位除法的最快方法是利用处理器对64位乘32位的本机支持吗? 有没有人知道是否有办法在几个较小的部门执行更大的部门? Re:B多久换一次? 主要是我对一个通用的解决scheme感兴趣 – 如果A和B每次都可能会有所不同,你会进行什么样的计算? 但是,第二种可能的情况是B不会像A那么频繁地变化 – 可能有多达200个A被B分开。在这种情况下你的答案会有什么不同?

NOP雪橇是如何工作的?

我一直在打开我的头,找不到一个很好的答案来回答这个问题。 我知道nop sled是一种用于规避缓冲区溢出攻击中堆栈随机化的技术,但我无法理解它是如何工作的。 什么是一个简单的例子来说明这种方法? 128字节的nop sled是什么意思?

为什么gcc允许从结构中投机加载?

显示可能会出错的gcc优化和用户代码示例 下面代码片段中的函数“foo”只会加载其中一个结构成员A或B; 至less这是未经优化的代码的意图。 typedef struct { int A; int B; } Pair; int foo(const Pair *P, int c) { int x; if (c) x = P->A; else x = P->B; return c/102 + x; } 以下是gcc -O3给出的内容: mov eax, esi mov edx, -1600085855 test esi, esi mov ecx, DWORD PTR [rdi+4] <– ***load P->B** cmovne […]

为什么构buildstd :: optional <int>比std :: pair <int,bool>更昂贵?

考虑这两种方法可以表示一个“可选的int ”: using std_optional_int = std::optional<int>; using my_optional_int = std::pair<int, bool>; 鉴于这两个function… auto get_std_optional_int() -> std_optional_int { return {42}; } auto get_my_optional() -> my_optional_int { return {42, true}; } … g ++ trunk和clang ++ trunk (使用-std=c++17 -Ofast -fno-exceptions -fno-rtti )会生成以下程序集: get_std_optional_int(): mov rax, rdi mov DWORD PTR [rdi], 42 mov BYTE PTR [rdi+4], 1 ret […]

什么是英特尔微代码?

从我读过的内容来看,它用来修复CPU中的错误而不修改BIOS。 根据我对汇编的基本知识,我知道汇编指令被CPU内部分成微码并相应执行。 但是intel以某种方式允许在系统启动并运行时进行一些更新。 任何人有更多的信息? 有没有关于微码可以做什么的文档,以及如何使用它们? 编辑:我读过维基百科的文章:没有弄清楚我怎么可以写一些我自己的,什么使用它会有。

为什么有条件的移动不容易出现分支预测失败?

在阅读这篇文章(在StackOverflow的答案) (在优化部分),我想知道为什么有条件的移动不容易分支预测失败。 我在这里find一篇有关cond动作的文章(AMD的PDF) 。 在那里,他们声称cond的性能优势。 移动。 但为什么呢? 我不明白 在评估ASM指令的那一刻,前面CMP指令的结果还不知道。 谢谢。