Tag: x86

LEA EAX,EAX有什么意义?

LEA EAX, [EAX] 我在用Microsoft C编译器编译的二进制文件中遇到了这个指令。 这显然不能改变EAX的价值。 那为什么呢?

如何为android-ndk8b(x86 arch Android)构buildi686-linux-android-gfortran?

我尝试使用build-gcc.sh构buildi686-linux-android-gfortran(这是forrodindk-7b),但是我得到关于link.h的错误。 我从这里添加了link.h,但是它提供了更多的错误。 有没有人试图启用x86的Android的i686-linux-android-gfortran?

你如何组装一个汇编程序?

我想制作一个简单的x86汇编程序。 我想知道是否有任何教程制作自己的汇编程序。 或者如果有一个简单的汇编程序,我可以学习。 另外,我想知道用什么工具来查看和处理程序的二进制/hex。

x86汇编 – 使用哪个可变大小(db,dw,dd)

我是一个初学者,我不知道db,dw,dd是什么意思。 我试图写这个1 + 1的小脚本,将它存储在一个variables中,然后显示结果。 这是我的代码到目前为止: .386 .model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib .data num db ? ; set variable . Here is where I don't know what data type to use. .code start: mov eax, 1 ; add 1 to eax register mov ebx, 1 […]

编译器中的布尔值为8位。 对他们的操作是低效的吗?

我正在阅读Agner Fog的“ 用C ++优化软件 ”(针对Intel,AMD和VIA的x86处理器),它在第34页 布尔variables存储为8位整数,值为0表示为false,1表示为true。 布尔variables是超定的,因为所有具有布尔variables作为input的运算符都检查input是否具有除0或1之外的其他值,但具有布尔值作为输出的运算符不能产生除0或1之外的其他值。作为input的布尔variables效率低于必要的。 这是今天仍然如此,编译器是什么? 你能举个例子吗? 作者说 如果能够确定地知道操作数不具有除0和1之外的其他值,则可以使布尔操作更加高效。编译器没有做出这样的假设的原因是如果variables可能具有其他值未初始化或来自不明的来源。 这是否意味着,如果我拿一个函数指针bool(*)()为例,并调用它,那么对它的操作产生低效的代码? 或者,当我通过解引用指针或从引用读取来访问布尔值,然后对其进行操作时,情况就是这样吗?

如何在英特尔语法中使用clang生成汇编代码?

正如这个问题所示,用g ++,我可以做g++ -S -masm=intel test.cpp 。 此外,与铿锵声,我可以做clang++ -S test.cpp ,但-masm=intel不支持铛( warning argument unused during compilation: -masm=intel )。 如何获得与clang英特尔语法?

在64位机器上使用Visual Studio 2010时,无法编辑并继续,应用程序定位到x86

在Windows 7 64位计算机上使用Visual Studio 2010时,出现“ 编辑并继续”的问题。 我已经确保以下 在“工具”>“选项”>“debugging”>“编辑并继续”下启用“编辑并继续” 我的解决scheme平台设置为x86 我的解决schemeconfiguration设置为debugging 我所有的项目都是为Debug和x86构build的 对于项目>属性>构build下的所有项目, 取消选中 优化代码 当我打破一个断点,并尝试编辑我,并面对以下消息。 以下情况下不允许更改:http://sedotech.com/Contenthttp://img.dovov.comedit-and-continue.png 这对我来说是所有我创build的项目,无论它们是WPF / Win Forms / VB.NET / C#/ .NET 4 / .NET 3。 有任何想法吗?

你如何确定使用Java的32位或64位体系结构的Windows?

你如何确定使用Java的32位或64位体系结构的Windows? 谢谢。

为什么这样复杂的代码是用二的幂来分割一个有符号的整数?

当我用VC ++ 10编译这个代码时: DWORD ran = rand(); return ran / 4096; 我得到这个反汇编: 299: { 300: DWORD ran = rand(); 00403940 call dword ptr [__imp__rand (4050C0h)] 301: return ran / 4096; 00403946 shr eax,0Ch 302: } 00403949 ret 这是干净简洁的,用合理的右移代替了两位的权力。 然而,当我编译这个代码: int ran = rand(); return ran / 4096; 我得到这个反汇编: 299: { 300: int ran = rand(); […]

现代C ++编译器的有效优化策略

我正在研究对性能至关重要的科学代码。 代码的初始版本已经被编写和testing,现在,使用Profiler,现在是时候从热点开始刮削周期了。 众所周知,一些优化,比如循环展开,现在由编译器处理得比用手工编程的程序员更有效。 哪些技术仍然值得? 很显然,我会通过一个分析器来运行所有的东西,但是如果有传统的智慧来判断哪些工作可以工作,哪些工作不工作,那将会为我节省很多时间。 我知道,优化是非常依赖于编译器和体系结构的。 我正在使用针对Core 2 Duo的英特尔C ++编译器,但是我也对gcc或者“任何现代编译器”都适用。 以下是我正在考虑的一些具体的想法: 用手工卷取代STL容器/algorithm有什么好处吗? 特别是,我的程序包含一个非常大的优先级队列(目前是一个std::priority_queue ),其操作花费了大量的时间。 这是值得研究的东西,还是STL实现可能是最快的? 沿着类似的路线,对于需要的大小未知,但有一个合理的小上限的std::vector s,用静态分配的数组replace它们是否有利呢? 我发现dynamic内存分配通常是一个严重的瓶颈,消除它会导致显着的加速。 因此,我很感兴趣的是,通过值返回大的临时数据结构与通过指针返回与通过引用传递结果的性能权衡。 有没有办法可靠地确定编译器是否将RVO用于给定的方法(当然,假设调用者不需要修改结果)? 编译器倾向于如何识别caching? 例如,是否值得重新sorting嵌套循环? 鉴于该计划的科学性,无处不在的浮点数。 我的代码中的一个重要瓶颈曾经是从浮点到整数的转换:编译器会发出代码来保存当前的舍入模式,更改它,执行转换,然后恢复旧的舍入模式 – 即使程序中没有任何内容曾改变舍入模式! 禁用此行为显着加快了我的代码。 是否有类似的浮点相关陷阱我应该知道? 单独编译和链接C ++的一个后果就是编译器无法做到看起来非常简单的优化,比如strlen()之类的方法调用超出了循环的终止条件。 有没有像这样的优化,我应该看看,因为它们不能由编译器完成,必须手工完成? 另一方面,是否有任何技术我应该避免,因为它们可能会干扰编译器自动优化代码的能力? 最后,扼杀某些种类的答案: 我知道优化在复杂性,可靠性和可维护性方面有成本。 对于这个特定的应用来说,性能的提高是值得的。 我知道最好的优化往往是提高高级algorithm,这已经完成了。