2012-02-05 117 views
1

我一直對彙編程序感興趣,但到目前爲止,我沒有真正有機會以最佳方式對付它。現在,當我有一段時間的時候,我開始使用匯編程序在C++中編寫一些小程序,但這只是小部分,即定義x,將它存儲在某處等等。我想在彙編程序中實現foor循環,但我無法完成,因此我想問問這裏有沒有人使用它,很高興在這裏分享。一些功能的例子是使用C++函數編譯循環彙編程序

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

任何人有一些想法如何在彙編實現這一點?

EDIT2:ISA 86

+1

我認爲std :: cout本身的實現將是一個巨大的任務。 – Lalaland 2012-02-05 22:08:04

+5

您可以隨時在C++中編寫代碼,查看生成的彙編代碼並獲取有關如何自行完成的提示。 – 2012-02-05 22:08:10

+1

什麼彙編語言?有時候你可以使用匯編中的系統調用來簡單地將某些內容打印到標準輸出(我知道MIPS所做的,對x86不確定) – 2012-02-05 22:08:11

回答

6

這裏的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來檢查。

5

嘗試重寫for循環在C++中使用gotoif聲明,你將有裝配版本的基礎知識。

+0

並使用'printf'或'puts'而不是iostreams。這將使得它更容易理解... – duskwuff 2012-02-05 22:13:22

+0

我假設他想知道的是'for'循環,因爲'cout'當然是另一回事了:) – ouah 2012-02-05 22:15:18

+0

+1一個很好而微妙的提示指向解決方案! – Veger 2012-02-05 22:15:28

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的智慧! :)好主意。 – 2012-02-05 22:19:55