C++ 用c+中的汇编程序对循环进行编码+;作用

C++ 用c+中的汇编程序对循环进行编码+;作用,c++,c,assembly,C++,C,Assembly,我一直对汇编程序感兴趣,但到目前为止,我还没有真正的机会以最好的方式面对它。现在,当我有一段时间,我开始使用C++中的汇编程序编写一些小程序,但这只是小程序,即定义X,存储在某处等等。我想在汇编程序中实现foor循环,但我做不到,所以我想问一下,这里是否有人用过它,很高兴在这里分享。某些函数的示例如下 用于(i=0;i < p>尝试使用 Goto < /Cord>和 > >语句,并将具有汇编版本的基本信息。 尝试使用C++代码> Goto < /Cord>和 > < /Cord>语句,重写C+

我一直对汇编程序感兴趣,但到目前为止,我还没有真正的机会以最好的方式面对它。现在,当我有一段时间,我开始使用C++中的汇编程序编写一些小程序,但这只是小程序,即定义X,存储在某处等等。我想在汇编程序中实现foor循环,但我做不到,所以我想问一下,这里是否有人用过它,很高兴在这里分享。某些函数的示例如下


用于(i=0;i < p>尝试使用<代码> Goto < /Cord>和<代码> > <代码> >语句,并将具有汇编版本的基本信息。

尝试使用C++代码> Goto < /Cord>和<代码> > < /Cord>语句,重写C++中的<<代码> >代码,并将具有汇编版本的基本信息。

< P>这是此代码的GCC未优化输出1:

void some_function(void);

int main()
{
  for (int i = 0; i < 137; ++i) { some_function(); }
}
通过优化
-O3
,加法+比较变成减法:

    pushl   %ebx          // save %ebx
    movl    $137, %ebx    // set %ebx to 137

    // some unrelated parts

.L2:
    call    some_function // some_function()
    subl    $1, %ebx      // subtract 1 from %ebx
    jne .L2               // if not equal to 0, repeat loop

1通过调用带有
-S
标志的GCC,可以检查生成的程序集。

以下是此代码的GCC未优化输出1:

void some_function(void);

int main()
{
  for (int i = 0; i < 137; ++i) { some_function(); }
}
通过优化
-O3
,加法+比较变成减法:

    pushl   %ebx          // save %ebx
    movl    $137, %ebx    // set %ebx to 137

    // some unrelated parts

.L2:
    call    some_function // some_function()
    subl    $1, %ebx      // subtract 1 from %ebx
    jne .L2               // if not equal to 0, repeat loop

1生成的程序集可以通过调用GCC用<代码> -s>代码>标志来检查。< /P> < P>可以尝试用C++或C反向编写程序,查看DISSASMAMBLE代码:

    for ( int i = 0 ; i < 10 ; i++ )
00E714EE  mov         dword ptr [i],0 
00E714F5  jmp         wmain+30h (0E71500h) 
00E714F7  mov         eax,dword ptr [i] 
00E714FA  add         eax,1 
00E714FD  mov         dword ptr [i],eax 
00E71500  cmp         dword ptr [i],0Ah 
00E71504  jge         wmain+4Bh (0E7151Bh) 
        cout << "A";
00E71506  push        offset string "A" (0E76800h) 
00E7150B  mov         eax,dword ptr [__imp_std::cout (0E792ECh)] 
00E71510  push        eax  
00E71511  call        std::operator<<<std::char_traits<char> > (0E71159h) 
00E71516  add         esp,8 
00E71519  jmp         wmain+27h (0E714F7h) 
for(int i=0;i<10;i++)
00E714EE mov dword ptr[i],0
00E714F5 jmp wmain+30小时(0E71500小时)
00E714F7 mov eax,dword ptr[i]
00E714FA添加eax,1
00E714FD mov dword ptr[i],eax
00E71500 cmp dword ptr[i],0Ah
00E71504 jge wmain+4Bh(0E7151Bh)

CUT

你可以尝试用C++或C来反向编写程序,查看DISSASMAMBLE代码:

    for ( int i = 0 ; i < 10 ; i++ )
00E714EE  mov         dword ptr [i],0 
00E714F5  jmp         wmain+30h (0E71500h) 
00E714F7  mov         eax,dword ptr [i] 
00E714FA  add         eax,1 
00E714FD  mov         dword ptr [i],eax 
00E71500  cmp         dword ptr [i],0Ah 
00E71504  jge         wmain+4Bh (0E7151Bh) 
        cout << "A";
00E71506  push        offset string "A" (0E76800h) 
00E7150B  mov         eax,dword ptr [__imp_std::cout (0E792ECh)] 
00E71510  push        eax  
00E71511  call        std::operator<<<std::char_traits<char> > (0E71159h) 
00E71516  add         esp,8 
00E71519  jmp         wmain+27h (0E714F7h) 
for(int i=0;i<10;i++)
00E714EE mov dword ptr[i],0
00E714F5 jmp wmain+30小时(0E71500小时)
00E714F7 mov eax,dword ptr[i]
00E714FA添加eax,1
00E714FD mov dword ptr[i],eax
00E71500 cmp dword ptr[i],0Ah
00E71504 jge wmain+4Bh(0E7151Bh)

我想在STD中实现STD::CUT将是一个巨大的任务。你可以在C++中编写代码,查看生成的汇编代码,并得到如何自己做的提示。什么样的汇编语言?有时你可以使用汇编中的SysCalk来简单地打印一些东西到STDUT(我知道MIPS确实,X86不确定)。@ SSG,并确保禁用优化!我认为调用<代码> PRTFF <代码>比使用<代码> CUT:更容易:“操作”认为STD::COUT的实现本身将是一个巨大的任务集。您可以始终在C++中编写代码,查看生成的汇编代码并获得关于如何自行编写代码的提示。uage?有时您还可以在汇编中使用syscall非常简单地将某些内容打印到stdout(我知道MIPS有,但不确定x86)@ssg并确保禁用优化!我认为调用
printf
可能比尝试使用
cout::operator并使用
printf
put
而不是iostreams更容易。这将使它更容易理解…我假设他想知道的是
for
循环,因为当然是
cout
这是另一个故事;)并使用
printf
put
而不是iostreams。这将使它更容易理解…我想他想知道的是
for
循环,因为
cout
当然是另一个故事;)