Tag: x86 64

请求gdb列出程序中的所有函数

如何用gdb列出程序中的所有函数?

学习汇编 – 我应该从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在64位平台上编译32位程序

我有一个专有的程序,我试图在64位系统上使用。 当我启动安装程序时,它工作正常,但在它尝试更新自身并编译一些模块之后无法加载它们。 我怀疑这是因为它使用gcc和gcc试图编译他们的64位系统,因此这个程序不能使用这些模块。 有什么办法(一些环境variables或类似的东西)强制gcc做一切的一个32位平台。 一个32位的chroot会工作吗?

为什么GCC调用libc的sqrt()而不使用它的结果呢?

使用GCC 6.3,下面的C ++代码: #include <cmath> #include <iostream> void norm(double r, double i) { double n = std::sqrt(r * r + i * i); std::cout << "norm = " << n; } 生成以下x86-64程序集: norm(double, double): mulsd %xmm1, %xmm1 subq $24, %rsp mulsd %xmm0, %xmm0 addsd %xmm1, %xmm0 pxor %xmm1, %xmm1 ucomisd %xmm0, %xmm1 sqrtsd %xmm0, %xmm2 […]

为什么构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 […]

为什么64位系统只有48位地址空间?

在一本书中,我读了以下内容: 32位处理器具有2 ^ 32个可能的地址,而当前的64位处理器具有48位地址空间 我的期望是,如果它是一个64位的处理器,地址空间也应该是2 ^ 64。 所以我想知道这个限制的原因是什么?

为什么memcmp(a,b,4)只是有时被优化为uint32比较?

鉴于此代码: #include <string.h> int equal4(const char* a, const char* b) { return memcmp(a, b, 4) == 0; } int less4(const char* a, const char* b) { return memcmp(a, b, 4) < 0; } x86_64上的GCC 7引入了对第一种情况的优化(Clang已经做了很长一段时间): mov eax, DWORD PTR [rsi] cmp DWORD PTR [rdi], eax sete al movzx eax, al 但第二种情况仍然调用memcmp() : sub rsp, 8 […]

什么是“代表” 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 […]

System.BadImageFormatException:无法加载文件或程序集(来自installutil.exe)

我正在尝试使用InstallUtil.exe安装Windows服务,并收到错误消息 System.BadImageFormatException:无法加载文件或程序集“ {xxx.exe} ”或其某个依赖项。 试图加载格式不正确的程序。 是什么赋予了? 编辑:(不是由OP)完整的消息提取从dup获取方式更多的点击[谷歌]: C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319> InstallUtil.exe C:\ xxx.exe Microsoft(R).NET Framework安装实用程序版本4.0.30319.1版权所有(c)Microsoft Corporation。 版权所有。 初始化安装时发生exception:System.BadImageFormatException:无法加载文件或程序集“file:/// C:\ xxx.exe”或其某个依赖项。 试图加载格式不正确的程序

浮点与现代硬件上的整数计算

我正在用C ++做一些关键性能的工作,而且我们目前正在使用整数计算来处理本质上浮点的问题,因为“更快”。 这导致了很多烦人的问题,并增加了很多令人讨厌的代码。 现在,我记得大约读了386天的浮点计算如此慢,我相信(IIRC)有一个可选的共同进程。 但是现在肯定有更复杂和更强大的CPU,如果进行浮点或整数计算,“速度”没有什么区别? 特别是由于实际的计算时间相对于导致pipe道失速或从主存储器中取出某些东西而言是微小的。 我知道正确的答案是在目标硬件上进行基准testing,那么testing它的好方法是什么? 我写了两个微小的C ++程序,并将它们的运行时间与Linux上的“time”进行了比较,但是实际运行时间太可变(不能帮助我在虚拟服务器上运行)。 没有花费我的整个一天运行数百个基准,制作图表等是否有我可以做的,以获得合理的相对速度testing? 任何想法或想法? 我完全错了吗? 我使用的程序如下,它们在任何方面都不相同: #include <iostream> #include <cmath> #include <cstdlib> #include <time.h> int main( int argc, char** argv ) { int accum = 0; srand( time( NULL ) ); for( unsigned int i = 0; i < 100000000; ++i ) { accum += rand( ) % […]