我一直对汇编程序感兴趣,但到目前为止,我没有真正有机会以最佳方式对付它。现在,当我有一段时间的时候,我开始使用汇编程序在C++中编写一些小程序,但这只是小部分,即定义x,将它存储在某处等等。我想在汇编程序中实现foor循环,但我无法完成,因此我想问问这里有没有人使用它,很高兴在这里分享。一些功能的例子是使用C++函数编译循环汇编程序
for(i=0;i<10;i++) { std::cout<< "A"; }
任何人有一些想法如何在汇编实现这一点?
EDIT2:ISA 86
我一直对汇编程序感兴趣,但到目前为止,我没有真正有机会以最佳方式对付它。现在,当我有一段时间的时候,我开始使用汇编程序在C++中编写一些小程序,但这只是小部分,即定义x,将它存储在某处等等。我想在汇编程序中实现foor循环,但我无法完成,因此我想问问这里有没有人使用它,很高兴在这里分享。一些功能的例子是使用C++函数编译循环汇编程序
for(i=0;i<10;i++) { std::cout<< "A"; }
任何人有一些想法如何在汇编实现这一点?
EDIT2:ISA 86
这里的GCC的未优化的输出此代码:
void some_function(void);
int main()
{
for (int i = 0; i < 137; ++i) { some_function(); }
}
movl $0, 12(%esp) // i = 0; i is stored at %esp + 12
jmp .L2
.L3:
call some_function // some_function()
addl $1, 12(%esp) // ++i
.L2:
cmpl $136, 12(%esp) // compare i to 136 ...
jle .L3 // ... and repeat loop less-or-equal
movl $0, %eax // return 0
leave // --"--
随着优化-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
生成的程序集可以通过调用带有-S
标志的GCC来检查。
你可以尝试反向 - 写在C++程序或C,并期待在dissasembled代码:
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)
再尝试它的意义。
+1的智慧! :)好主意。 – 2012-02-05 22:19:55
我认为std :: cout本身的实现将是一个巨大的任务。 – Lalaland 2012-02-05 22:08:04
您可以随时在C++中编写代码,查看生成的汇编代码并获取有关如何自行完成的提示。 – 2012-02-05 22:08:10
什么汇编语言?有时候你可以使用汇编中的系统调用来简单地将某些内容打印到标准输出(我知道MIPS所做的,对x86不确定) – 2012-02-05 22:08:11