Санкт-Петербургский политехнический университет Петра Великого
Институт компьютерных наук и технологий
Высшая школа интеллектуальных систем и суперкомпьютерных технологий
ЛАБОРАТОРНАЯ РАБОТА №6 Команды и способы адресации для х86 в 32-битном режиме. по дисциплине «Архитектура вычислительных систем»
Выполнил
студент гр.3530903/90302 Докукин Э.А.
Руководитель Вербова Н.М.
доцент, к.ф.-м.н.
Санкт-Петербург
2022
#include
unsigned long cMas[10];
int i;
void main() {
00991000 55 push ebp
Помещение ebp в стек (неявная) 00991001 8B EC mov ebp,esp
Записывание esp в ebp (регистровая, регистровая) 00991003 51 push ecx
Помещение ecx в стек (неявная) 00991004 53 push ebx
Помещение ebx в стек (неявная)
i = 1;
00991005 B9 01 00 00 00 mov ecx,1
Записывание 1 в ecx (регистровая, непосредственная) 0099100A C7 45 FC 04 00 00 00 mov dword ptr [ebp-4],4
Записывание значения 4 в ячейку с размером 32-бита по адресу из ebp со сдвигом -4 (косвенная, непосредственная) 00991011 56 push esi
Помещение esi в стек (неявная) 00991012 57 push edi
Помещение edi в стек (неявная) 00991013 8D 59 1A lea ebx,[ecx+1Ah]
Помещение значения по адресу из ecx со сдвигом +1Ah в ebx (регистровая, косвенная) 00991016 8D 71 02 lea esi,[ecx+2]
Помещение значения по адресу из ecx со сдвигом +2 в esi (регистровая, косвенная) 00991019 8D 79 07 lea edi,[ecx+7]
Помещение значения по адресу из ecx со сдвигом +7 в edi (регистровая, косвенная) 0099101C 0F 1F 40 00 nop dword ptr [eax]
Заполнение места в коде командой nop (косвенная)
do {
if ((i >= 3) && (i != 5))
00991020 83 F9 03 cmp ecx,3
Сравнение 3 и ecx (регистровая, непосредственная) 00991023 7C 0C jl main+31h (0991031h)
Переместиться на команду по адресу (0991031h), если ecx < 3 (косвенная) 00991025 83 F9 05 cmp ecx,5
Сравнение ecx и 5 (регистровая, непосредственная) 00991028 74 07 je main+31h (0991031h)
Переместиться на команду по адресу (0991031h), если ecx == 3 (непосредственная)
cMas[i] = (3 * i) ^ 0x18;
0099102A 8B C6 mov eax,esi
Записывание значения esi в eax (регистровая, регистровая) 0099102C 83 F0 18 xor eax,18h
Применение побитовой операции xor для eax и 18h. (регистровая, непосредственная) 0099102F EB 0B jmp main+3Ch (099103Ch)
Переместиться на команду по адресу 099103Ch (непосредственная)
else
cMas[i] = (27 * i) / 8;
00991031 8B C3 mov eax,ebx
Записывание ebx в eax (регистровая, регистровая) 00991033 99 cdq
Распространяет значение знакового бита в регистре eax на все биты регистра edx
00991034 83 E2 07 and edx,7
Выполняет логическое И между всеми байта 7 и edx (регистровая, непосредственная) 00991037 03 C2 add eax,edx
Суммирует edx и eax и записывает значение в eax (регистровая, регистровая) 00991039 C1 F8 03 sar eax,3
Сдвигает биты eax на 3 позиции (регистровая, непосредственная)
i++;
0099103C 8B 55 FC mov edx, dword ptr [ebp-4]
Записывание значения по адресу из ebp со сдвигом -4 (регистровая, косвенная) в edx 0099103F 41 inc ecx
Инкремент ecx (регистровая) 00991040 89 7D FC mov dword ptr [ebp-4],edi
Записывание значения из edi по адресу из ebp со смещением -4 (косвенная, регистровая) 00991043 83 C6 03 add esi,3
Суммирует 3 и esi и записывает результат в esi (регистровая, непосредственная) 00991046 83 C7 04 add edi,4
Суммирует 4 и edi и записывает результат в edi (регистровая, непосредственная) 00991049 83 C3 1B add ebx,1Bh
Суммирует 1Bh и ebx и записывает результат в ebx (регистровая, непосредственная) 0099104C 89 82 80 33 99 00 mov dword ptr cMas (0993380h)[edx],eax
Записывание значения из eax по адресу из edx со сдвигом cMas (косвенная, регистровая) 00991052 89 0D A8 33 99 00 mov dword ptr [i (09933A8h)],ecx
Записывание значения ecx в память по адресу 09933A8h (косвенная, регистровая) } while (i < 9);
00991058 83 F9 09 cmp ecx,9
Сравнение значения в ecx и 9 (регистровая, непосредственная) 0099105B 7C C3 jl main+20h (0991020h)
Переместиться на команду по адресу 0991020h, если ecx < 9 (непосредственная) }
0099105D 5F pop edi
Извлечение значения в edi из стека (регистровая) 0099105E 5E pop esi
Извлечение значения в esi из стека (регистровая) 0099105F 33 C0 xor eax,eax
Применение побитовой операции xor для eax. Обнуление значения eax. (регистровая, регистровая)
00991061 5B pop ebx
Извлечение значения в ebx из стека (регистровая) 00991062 8B E5 mov esp,ebp
Записывание значения из ebp в esp (регистровая, регистрвая) 00991064 5D pop ebp
Извлечение значения в ebp из стека (регистровая) 00991065 C3 ret
Возврат из текущей процедуры.