小编Rya*_*ney的帖子

你如何在gcc中从C/C++源获得汇编程序输出?

怎么做到这一点?

如果我想分析如何编译某些内容,我将如何获得发出的汇编代码?

c c++ debugging assembly gcc

340
推荐指数
14
解决办法
31万
查看次数

使用GCC生成可读组件?

我想知道如何在我的C源文件中使用GCC来转储机器代码的助记符版本,以便我可以看到我的代码被编译成什么.您可以使用Java执行此操作,但我无法找到GCC的方法.

我试图在汇编中重新编写一个C方法,看看GCC是如何做的,这将是一个很大的帮助.

c assembly gcc

238
推荐指数
9
解决办法
15万
查看次数

为什么不经常在汇编中编写程序?

似乎主流观点认为汇编编程需要更长时间并且比C等更高级别的语言更难编程.因此,似乎建议或假设出于这些原因更好地编写更高级别的语言并且为了更好的便携性.

最近我一直在写x86汇编,我突然意识到这些原因可能不是真的,除了可能的可移植性.也许这更多的是熟悉并且知道如何很好地编写装配.我还注意到汇编中的编程与HLL中的编程完全不同.也许一个优秀且经验丰富的汇编程序员可以像经验丰富的C程序员用C语言一样轻松快速地编写程序.

也许是因为汇编程序设计与HLL完全不同,因此需要不同的思维,方法和方法,这使得为不熟悉的程序编程看起来很尴尬,因此给它编写程序的坏名称.

如果可移植性不是问题,那么真的,C会对NASM这样的好汇编程序有什么影响?

编辑: 只是指出.在汇编时编写时,不必只是在指令代码中编写.您可以使用宏和过程以及您自己的约定来进行各种抽象,以使程序更加模块化,更易于维护和更易于阅读.这是熟悉如何编写良好汇编的地方.

c assembly programming-languages

216
推荐指数
12
解决办法
27万
查看次数

保护可执行文件免受逆向工程?

我一直在考虑如何保护我的C/C++代码免于反汇编和逆向工程.通常我永远不会在我的代码中宽恕这种行为; 然而,为了各种人的安全,我一直在努力的现行协议绝不能被检查或理解.

现在这对我来说是一个新的主题,互联网并不是真正有效防范逆向工程,而是描绘了大量有关如何逆向工程的信息

到目前为止我想到的一些事情是:

  • 代码注入(在实际函数调用之前和之后调用虚函数)
  • 代码obfustication(破坏二进制的反汇编)
  • 编写我自己的启动例程(调试器更难绑定)

    void startup();  
    int _start()   
    {  
        startup( );  
        exit   (0)   
    }  
    void startup()  
    {  
        /* code here */  
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 运行时检查调试器(如果检测到则强制退出)

  • 功能蹦床

     void trampoline(void (*fnptr)(), bool ping = false)  
     {  
       if(ping)  
         fnptr();  
       else  
         trampoline(fnptr, true);  
     }
    
    Run Code Online (Sandbox Code Playgroud)
  • 无意义的分配和解除分配(堆栈变化很多)

  • 毫无意义的虚拟呼叫和蹦床(在反汇编输出中大量跳跃)
  • 铸造吨(用于混淆的拆卸)

我的意思是这些是我所想到的一些事情,但是在适当的时间范围内,它们都可以被代码分析师解决或者解决.我还有其他选择吗?

c c++ obfuscation assembly

205
推荐指数
18
解决办法
6万
查看次数

学习大会

我决定学习汇编语言.这样做的主要原因是能够理解反汇编的代码,并且可能能够编写更有效的代码部分(例如,通过c ++),做一些代码洞穴等等.我看到有大量不同的程序集所以,就我提到的目的而言,我该如何开始?我应该学习什么样的装配?我想通过首先做一些简单的程序(即计算器)来学习,但目标本身将是与它一起被认可,所以我可以理解所显示的代码,例如IDA Pro.

我正在使用Windows(如果这有任何区别).

编辑:所以,似乎每个人都指向MASM.虽然我明白它具有高级功能,但对于汇编代码程序员来说都很有用,这不是我想要的.它似乎有流行的反汇编程序(如IDA)中没有显示的if,invoke等指令.所以,如果可能的话,我想听到的是任何使用ASM的人的意见(我在IDA中阅读反汇编的exe代码),而不仅仅是"通用"汇编程序员.

编辑:好的.我已经在学习集会了.我正在学习MASM,而不是使用对我来说无关紧要的高级东西.我现在正在做的是在c ++中使用__asm指令尝试我的代码,所以我可以比使用MASM从头开始做所有事情更快地尝试.

assembly

99
推荐指数
7
解决办法
4万
查看次数

为什么GCC使用NOP填充功能?

我已经和C一起工作了一段时间,最近才开始进入ASM.当我编译一个程序时:

int main(void)
  {
  int a = 0;
  a += 1;
  return 0;
  }
Run Code Online (Sandbox Code Playgroud)

objdump反汇编有代码,但在ret之后nops:

...
08048394 <main>:
 8048394:       55                      push   %ebp
 8048395:       89 e5                   mov    %esp,%ebp
 8048397:       83 ec 10                sub    $0x10,%esp
 804839a:       c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%ebp)
 80483a1:       83 45 fc 01             addl   $0x1,-0x4(%ebp)
 80483a5:       b8 00 00 00 00          mov    $0x0,%eax
 80483aa:       c9                      leave  
 80483ab:       c3                      ret    
 80483ac:       90                      nop
 80483ad:       90                      nop
 80483ae:       90                      nop
 80483af:       90                      nop
...
Run Code Online (Sandbox Code Playgroud)

从我学到的东西,什么都不做,因为ret之后甚至都不会被执行.

我的问题是:为什么要这么麻烦?ELF(linux-x86)无法使用任何大小的.text段(+ main)吗? …

c assembly gcc

76
推荐指数
3
解决办法
7519
查看次数

计算128位整数模数为64位整数的最快方法

我有一个128位无符号整数A和一个64位无符号整数B.什么是最快的计算方法A % B- 即将A除以B的(64位)余数?

我希望用C或汇编语言来做这件事,但我需要针对32位x86平台.遗憾的是,我无法利用编译器对128位整数的支持,也无法利用x64架构在单条指令中执行所需操作的能力.

编辑:

谢谢你到目前为止的答案.但是,在我看来,建议的算法会非常慢 - 执行128位到64位除法的最快方法是利用处理器对64位乘32位除法的原生支持吗?有没有人知道是否有办法在一些较小的部门中执行更大的划分?

回复:B多久换一次?

主要是我对一般解决方案感兴趣 - 如果A和B每次都可能不同,你会进行什么计算?

然而,第二种可能的情况是B不会像A那样经常变化 - 每个B可能有多达200个As除以.在这种情况下,你的答案有何不同?

c algorithm x86 assembly modulo

53
推荐指数
5
解决办法
2万
查看次数

在C/C++中使用汇编语言

我记得在某处可以真正优化和加速代码的某些部分,程序员用汇编语言编写该部分.我的问题是 -

  1. 这种做法还在做吗?一个人怎么做?
  2. 不是用汇编语言编写有点过于繁琐和陈旧吗?
  3. 当我们编译C代码(带或不带-O3标志)时,编译器会进行一些代码优化并链接所有库并将代码转换为二进制对象文件.因此,当我们运行程序时,它已经处于最基本的形式,即二进制.那么如何诱导'汇编语言'有帮助?

我正在努力理解这个概念,非常感谢任何帮助或链接.

更新:根据dbemerlin的要求改写第3点 - 因为您可能能够编写比编译器生成的更有效的汇编代码,但除非您是汇编专家,否则您的代码运行速度会慢,因为编译器通常会比大多数人更好地优化代码.

c c++ optimization assembly compiler-optimization

43
推荐指数
4
解决办法
1万
查看次数

C代码循环性能

我的应用程序中有一个乘法添加内核,我想提高它的性能.

我使用英特尔酷睿i7-960(3.2 GHz时钟)并已使用SSE内在函数手动实现内核,如下所示:

 for(int i=0; i<iterations; i+=4) {
    y1 = _mm_set_ss(output[i]);
    y2 = _mm_set_ss(output[i+1]);
    y3 = _mm_set_ss(output[i+2]);
    y4 = _mm_set_ss(output[i+3]);

    for(k=0; k<ksize; k++){
        for(l=0; l<ksize; l++){
            w  = _mm_set_ss(weight[i+k+l]);

            x1 = _mm_set_ss(input[i+k+l]);
            y1 = _mm_add_ss(y1,_mm_mul_ss(w,x1));
            …
            x4 = _mm_set_ss(input[i+k+l+3]);
            y4 = _mm_add_ss(y4,_mm_mul_ss(w,x4));
        }
    }
    _mm_store_ss(&output[i],y1);
    _mm_store_ss(&output[i+1],y2);
    _mm_store_ss(&output[i+2],y3);
    _mm_store_ss(&output[i+3],y4);
 }
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用压缩的fp向量来提高性能,我已经成功完成了,但我想知道为什么单个标量代码无法满足处理器的峰值性能.

我的机器上的这个内核的性能是每个周期大约1.6个FP操作,而每个周期最大的是2个FP操作(因为FP add + FP mul可以并行执行).

如果我对研究生成的汇编代码是正确的,理想的时间表将如下所示,其中mov指令需要3个周期,从依赖指令的加载域到FP域的切换延迟需要2个周期,FP乘以4个循环,FP添加需要3个循环.(注意,乘法 - > add的依赖性不会导致任何切换延迟,因为操作属于同一个域).

时间表

根据测量的性能(最大理论性能的约80%),每8个周期有大约3个指令的开销.

我想要:

  • 摆脱这种开销,或
  • 解释它来自哪里

当然,存在缓存未命中和数据错位的问题,这可能会增加移动指令的延迟,但是还有其他因素可以在这里发挥作用吗?像寄存器读取档位或什么?

我希望我的问题很明确,在此先感谢您的回复!


更新:内循环的程序集如下所示:

...
Block 21: 
  movssl  (%rsi,%rdi,4), %xmm4 
  movssl  (%rcx,%rdi,4), %xmm0 
  movssl  0x4(%rcx,%rdi,4), %xmm1 …
Run Code Online (Sandbox Code Playgroud)

c performance assembly intel instructions

40
推荐指数
1
解决办法
4039
查看次数

C代码如何调用汇编代码(例如优化的strlen)?

我总是阅读有关C编程语言中某些函数如何通过汇编编写来优化的内容.如果那句话听起来有些误导,请告诫我.

所以,我会清楚地说明:当你在UNIX/C系统上调用像strlen这样的函数时,你调用的实际函数是用汇编编写的?你能以某种方式将程序集编写到C程序中,还是外部调用情况?能够做到这一点是C标准的一部分,还是特定于操作系统的东西?

c unix assembly

31
推荐指数
3
解决办法
2468
查看次数