【问题标题】:Writing a for loop in assembly from scratch从头开始在汇编中编写 for 循环
【发布时间】:2012-04-17 07:34:41
【问题描述】:

您好,我目前正在尝试自己学习 C++ 中的汇编。我的项目中有汇编代码,目前处于高级 c++ for 循环中,如果可能的话,我需要帮助将其转换为完全汇编,这是我目前拥有的代码:

char temp_char;
for (int i = 0; i < length; i++){
    temp_char = characters [i];
    __asm {                         
        push eax    
        push ecx
        movsx ecx,temp_char
        movsx eax,key   
        push ecx    
        push eax
        call test
        add esp, 8
        mov temp_char,al
        pop ecx 
        pop eax
    }
}

【问题讨论】:

  • 只是语义:注意您正在寻找assembly 代码而不是assembler。汇编器就是把汇编转换成二进制代码的东西……
  • @amit 谢谢你编辑了:)
  • 为什么不简单地检查编译器的结果?我想甚至 VisualC++ 也支持从编译 C/C++ 代码的结果中输出汇编语言文件。或者,如果失败,请对生成的二进制文件使用反汇编程序,以向编译器学习。
  • 对不起,我试图查看反汇编程序,但对我来说没有太大意义。
  • @Paul- 如果您正在检查编译器的汇编输出,我建议在构建之前禁用 all 形式的优化。这使程序集尽可能地忠实于底层代码。经过大量优化的程序集最终可能会非常混乱。

标签: c++ visual-studio visual-c++ assembly for-loop


【解决方案1】:

您的for 行包含三个部分。在组装级别进行思考时,有助于将它们分开。一个简单的方法是将for 重写为while

char temp_char;

int i = 0;
while (i < length) {
    temp_char = characters [i];
    __asm {                         
        push eax    
        push ecx
        movsx ecx,temp_char
        movsx eax,key   
        push ecx    
        push eax
        call test
        add esp, 8
        mov temp_char,al
        pop ecx 
        pop eax
    }
    i++;
}

您应该能够相当轻松地将int i=0i++ 行转换为程序集。唯一剩下的是whilewhile 的顶部通常实现为条件和跳转(或条件跳转,如果您的平台支持此类操作)。如果条件为真,则进入循环;如果条件为假,则跳过循环(跳到末尾)。 while 的底部只是无条件跳回循环顶部。

【讨论】:

  • 感谢您的帮助,我现在离得更近了,仍然有点困惑,但我到了那里,这就是学习的本质:)
  • @Paul- 尽量从基础开始。尽可能创建最简单的循环,可能类似于for (int i=0; i&lt;10; ++i) { ++x; }。在禁用所有优化的情况下编译它并查看发出的程序集。使用调试器两次浏览代码(一次在 C 级调试,一次在汇编级调试)。一旦你看到它在行动几次,你应该开始感觉到正在发生的事情。可以并排显示 C 代码和发出的程序集的调试器使这更容易。
猜你喜欢
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多