Кодирование цикла с ассемблером в функции c ++ - PullRequest
1 голос
/ 06 февраля 2012

Я всегда интересовался ассемблером, однако до сих пор у меня не было настоящего шанса противостоять ему наилучшим образом.Теперь, когда у меня есть некоторое время, я начал кодировать некоторые маленькие программы с использованием ассемблера в c ++, но это всего лишь маленькие, то есть определить x, сохранить его где-то и так далее, и так далее, и так далее.Я хотел реализовать цикл foor в ассемблере, но я не смог сделать это, поэтому я хотел бы спросить, если бы кто-нибудь здесь когда-либо делал с этим, было бы неплохо поделиться здесь.Примером какой-либо функции может быть

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

Кто-нибудь знает, как реализовать это в ассемблере?

edit2: ISA x86

Ответы [ 3 ]

6 голосов
/ 06 февраля 2012

Вот неоптимизированный вывод 1 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

1 Сгенерированная сборка может быть проверена путем вызова GCC с флагом -S.

5 голосов
/ 06 февраля 2012

Попробуйте переписать цикл for в C ++, используя операторы goto и if, и вы получите основы для версии сборки.

2 голосов
/ 06 февраля 2012

Вы можете попробовать обратное - напишите программу на C ++ или C и посмотрите на разбитый код:

    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) 

, а затем попытайтесь разобраться в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...