2012-02-05 51 views
1

私はいつもアセンブラに興味がありましたが、これまでのところ、私は最良の方法でそれに直面する本当のチャンスはありませんでした。さて、私はしばらくすると、C++でアセンブラを使っていくつかの小さなプログラムをコーディングし始めましたが、それはちょっと小さいものです。つまり、xを定義し、どこかに格納するなどです。私はアセンブラでfoorループを実装したいと思っていましたが、できませんでしたので、ここで誰かがそれをやったことがあるかどうか聞いてみたいと思います。いくつかの機能の例はC++関数でアセンブラを使ったループのコーディング

for(i=0;i<10;i++) { std::cout<< "A"; }

は、誰もがいくつかのアイデアはどのようにアセンブラでこれを実装するためにしているだろうか?

EDIT2:ISA x86の

+1

私はstd :: coutの実装自体が組み立ての巨大なタスクになると思います。 – Lalaland

+5

あなたはいつでもC++でコードを書くことができ、生成されたアセンブリコードを見て、自分でそれを行う方法のヒントを得ることができます。 –

+1

どのようなアセンブリ言語ですか?また、アセンブリでsyscallを使ってstdoutに何かを非常に単純に印刷することもできます(私はMIPSはx86についてはわかりません) –

答えて

6

このコードのためのGCCの最適化されていない出力だ:最適化-O3

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       // --"-- 

、加算+比較は減算になっている。

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を呼び出すことによって調べることができます。

5

gotoifステートメントを使用してC++でforループを書き換えるようにしてください、あなたは、アセンブリバージョンのための基礎を持っています。ここ

+0

そして、iostreamの代わりに 'printf'や' puts'を使います。それはそれをもっと理解しやすくなります... – duskwuff

+0

私は彼が知りたいと思うのは、 'for'ループです。なぜなら、それはもう一つの物語です。) – ouah

+0

+1素晴らしいと微妙なヒントポインティングソリューションに!アイデアのために+1 – Veger

2

あなたが逆を試みることができる - 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) 

それの意味を理解してみてください。

+0

+1の独創性! :)優れたアイデア。 –

関連する問題