Системное программное обеспечение. Теория языков программирования и методы трансляции, страница 3

label_0_0

!=

second

first

push

jmpOnFalse

label_0_1

pop

second

first

push

jmpOnFalse

label_1_0

pop

-=

first

second

second

jmp

label_1_1

label_1_0

-=

second

first

first

label_1_1

jmp

label_0_0

label_0_1

return

First


ОМ (объектный модуль) без оптимизации:

Прямоугольная выноска: Нет в УП//int nod(int first, int second){

00411B00       55                 push         ebp

00411B01       8B EC          mov         ebp,esp

00411B03       83 EC 40      sub           esp,40h                           //эта команда может быть удалена при оптимизации

00411B06       53                 push         ebx                                  //эта команда может быть удалена при оптимизации

00411B07       56                 push         esi                                   //эта команда может быть удалена при оптимизации

00411B08       57                 push         edi                                   //эта команда может быть удалена при оптимизации

//     while(first != second)

00411B09       8B 45 08      mov         eax,dword ptr [first]

00411B0C      3B 45 0C      cmp         eax,dword ptr [second]

00411B0F       74 1E            je             nod+2Fh (411B2Fh)       //при оптимизации должно быть другое смещение

//            if(first < second)

00411B11       8B 45 08      mov         eax,dword ptr [first]       //эта команда может быть удалена при оптимизации

00411B14       3B 45 0C      cmp         eax,dword ptr [second]   //эта команда может быть удалена при оптимизации

00411B17       7D 0B           jge           nod+24h (411B24h)       //при оптимизации должно быть другое смещение

//                   second -= first;

00411B19       8B 45 0C      mov         eax,dword ptr [second]

00411B1C      2B 45 08      sub           eax,dword ptr [first]

00411B1F       89 45 0C      mov         dword ptr [second],eax

//            else

00411B22       EB 09           jmp          nod+2Dh (411B2Dh)     //при оптимизации переход должен быть на начало цикла

//                   first -= second;

00411B24       8B 45 08      mov         eax,dword ptr [first]       //эта команда может быть удалена при оптимизации

00411B27       2B 45 0C      sub           eax,dword ptr [second]

00411B2A      89 45 08       mov         dword ptr [first],eax

00411B2D      EB DA         jmp          nod+9 (411B09h)           //при оптимизации переход должен быть на следующую команду

//     return first;

00411B2F       8B 45 08      mov         eax,dword ptr [first]       //эта команда может быть удалена при оптимизации

//}

00411B32       5F                 pop          edi                                   //эта команда может быть удалена при оптимизации

00411B33       5E                 pop          esi                                   //эта команда может быть удалена при оптимизации

00411B34       5B                pop          ebx                                  //эта команда может быть удалена при оптимизации

00411B35       8B E5           mov         esp,ebp

00411B37       5D                pop          ebp

00411B38       C3                ret

Прямоугольная выноска: Нет в УПОМ (объектный модуль) после оптимизации:

//int nod(int first, int second){

00411B00       55                 push         ebp

00411B01       8B EC          mov         ebp,esp

//     while(first != second)

00411B03       8B 45 08      mov         eax,dword ptr [first]

00411B06       3B 45 0C      cmp         eax,dword ptr [second]

00411B09       74 1E            je             nod+20h (411B2Fh)

//            if(first < second)

00411B0B      7D 0B           jge           nod+18h (411B24h)

//                   second -= first;

00411B0D      8B 45 0C      mov         eax,dword ptr [second]

00411B10       2B 45 08      sub           eax,dword ptr [first]

00411B13       89 45 0C      mov         dword ptr [second],eax

//            else

00411B16       EB 09           jmp          nod+3 (411B2Dh)

//                   first -= second;

00411B18       2B 45 0C      sub           eax,dword ptr [second]

00411B1B      89 45 08       mov         dword ptr [first],eax

00411B1E      EB DA         jmp          nod+6 (411B09h)

//     return first;

//}

00411B20       8B E5           mov         esp,ebp

00411B22       5D                pop          ebp

00411B23       C3                ret