ДС18в04-машинный-уровень-1-Основы (1238907)
Текст из файла
Carnegie MellonМашинный уровень1: ОсновыОсновы информатики.Компьютерные основы программированияgoo.gl/X7evFНа основе CMU 15-213/18-243:Introduction to Computer Systemsgoo.gl/Q7vgWwЛекция 4, 26 февраля, 2018Лектор:Дмитрий Северов, кафедра информатики 608 КПМdseverov@mail.mipt.ruw27001.vdi.mipt.ru/wp/?page_id=3461Машинный уровень 1: ОсновыКраткая история изделий Интел¢ Си, ассемблер, машинный код¢ Основы ассемблера: регистры, операнды, пересылки¢ Арифметические и логические операции¢2Процессоры Intel x86Подавляющее доминирование на рынках настольныхПК, ноутбуков, серверов¢ Эволюционное конструирование¢§ Обратно совместимы до 8086, выпущенного в 1978§ Функции добавляются с ходом времени¢Complex instruction set computer (CISC)§ Много команд во многих форматахНо, лишь немногие встречаются в Linux программах§ Трудно конкурировать по быстродействию сReduced Instruction Set Computers (RISC)§ Однако, Intel сделал именно это!§ В терминах быстродействия.
Но не энергопотребления.§3Вехи эволюции Intel x86Имя¢ 8086Дата1978Транзисторов29KМГц5-10§ 1-й 16-битный процессор. Основа для IBM PC & DOS§ 1MB адресного пространства¢3861985275K16-33§ 1-й 32-битный процессор, известен как IA32§ Добавлена плоская адресация , способен исполнять Unix¢Pentium 4F2004125M2800-3800§ 1-й 64-битный процессор, известен как x86-64¢Core 22006291M1060-3500731M2667-3333§ First multi-core Intel processor¢Core i72008§ Почти современные машины4Процессоры Intel x86, далее¢Эволюция машин§§§§§§§§§¢386PentiumPentium/MMXPentiumProPentium IIIPentium 4Core 2 DuoCore i7Core i71985199319971995199920012006200820160.3M3.1M4.5M6.5M8.2M42M291M731M2.6-3.6BДобавленные возможности§§§§Команды обработки данных мультимедиа(multimedia), криптографииКоманды для более эффективной условной обработкиПереход от 32-битного слова к 64-битномуБольше ядер5Современное состояние 2015§ Core i7 Broadwell 2015¢Настольная модель§§§§¢4 ядраВстроенная графика3.3-3.8 ГГц65ВтСерверная модель§§§§8 ядерВстроенный ввод/вывод2-2.6 ГГц45Вт6Клон x86: Advanced Micro Devices (AMD)¢Сначала§ AMD догоняла Intel§ Немного медленнее, много дешевле¢Потом§ Привлекла лучших аппаратчиков из Digital Equipment Corp.
Идругих компаний§ Создала Opteron: сильного соперника Pentium 4§ Разработала x86-64, собственное 64-битное расширение¢Последние годы§ Intel вертикально интегрированная компанияМировой лидер в полупроводниковых технологиях§ AMD опирается на сторонних изготовителей ИС§ Существенно отстаёт от Intel§764-битный Intel¢2001: Intel попытался радикально сменить IA32 на IA64§ Полностью другая архитектура (Itanium)§ Исполнение кода IA32, только как устаревшего§ Разочаровывающее быстродействие¢2003: AMD вышла с эволюционным решением§ x86-64 (сейчас известна как AMD64 )¢Intel нарушил обязательство сосредоточения на IA64§ Трудно признавать ошибки и превосходство AMD¢2004: Intel анонсировал EM64T расширение к IA32§ 64-битная технология расширенной памяти§ Почти идентична x86-64!¢Сейчас все low-end процессоры x86 содержат x86-64§ Однако много кода всё ещё в 32-битном режиме8Мы затронем¢IA32§ Традиционная x86¢x86-64/EM64T§ Современный стандарт¢Разделы в книге§ 3.1—3.12 об IA32,§ 3.13 об x86-649Машинный уровень 1: ОсновыКраткая история изделий Интел¢ Си, ассемблер, машинный код¢ Основы ассемблера: регистры, операнды, пересылки¢ Арифметические и логические операции¢10Определения¢Архитектура(системы команд), также instruction setarchitecture: ISA.
Часть конструкции процессора которуюнадо знать для понимания ассемблерного кода.§ Примеры: описание набора команд, регистры.¢Микроархитетура: Реализация архитектуры.§ Примеры: размер кеша и частота ядра.¢Формы кода:§ Машинный код: содержимое байтов, исполняемое процессором§ Ассемблерный код: текстовое представление машинного кода¢Примеры ISA (Intel): x86, IA, IPF11Программная модель ассемблераЦП(CPU)Счётчиккоманд(PC)¢РегистрыАдресаДанныеКодыусловийАдрес следующей команды§Имя: EIP (IA32) or RIP (x86-64)§ Набор регистров§Наиболее используемые данные§ Коды условийХранят информацию о состоянии самойпоследней арифм.
команды§ Используются для условных переходов§Код программыДанные программыКомандыСтек программыПрограммное состояние§ PC: Счётчик команд§Память§ ПамятьМассив адресуемых байт§ Код, данные пользователя§ Включая стек для поддержкипроцедур§12Трансляция Cи кода в объектный§ Код в файлах p1.c p2.c§ Компилируем командой: gcc –Og p1.c p2.c -o pИспользуем минимальную оптимизацию (-Og)§ Помещаем результирующий двоичный код в файл p§текстCи программа (p1.c p2.c)Компилятор (gcc -Og -S)текстАссемблерная программа (p1.s p2.s)Ассемблер (gcc или as)двоичныйкодОбъектный код (p1.o p2.o)Редактор (gcc или ld)двоичныйкодСтатическиебиблиотеки (.a)Загружаемый код (p)13Компиляция в ассемблерCи код (sum.c)long plus(long x, long y);void sumstore(long x, long y,long *dest){long t = plus(x, y);*dest = t;}Сгенерированный кодассемблера x86-64sumstore:pushqmovqcallmovqpopqret%rbx%rdx, %rbxplus%rax, (%rbx)%rbxПолучается командойgcc –Og -S sum.cСоздаёт файл sum.sВнимание: даёт сильно различные результаты в различныхокружениях из-за различных версий gcc и различныхпараметров компилятора.14“Типы данных” ассемблера¢1-, 2-, 4- или 8-байтные целочисленные данные§ Значения данных§ Адреса (нетипизированные указатели)¢¢¢4-, 8-, или 10- байтные данные с плавающей точкойКод: последовательности байт, кодирующиепоследовательность командНикаких сложных типов как массивы или структуры§ Просто подряд расположенные в памяти байты15Операции ассемблера¢¢Арифметические операции с данными в регистрах или впамятиПередача данных между памятью и регистрами§ Загружают данные из памяти в регистры§ Выгружают данные из регистров в память¢Передача управления§ Безусловные переходы§ Условные переходы§ Вызов процедур и возврат из них16Объектный кодКод sum¢Ассемблер0x0400595:§ Транслирует .s в .o0x53§ Кодирует команды двоичным кодом0x480x89§ Почти готовый к загрузке год0xd3§ Межфайловых связей кода0xe80xf2¢ Редактор (связей)0xff§ Выполняет ссылки между файлами0xff§ Компонует со статическими библиотеками0xff0x48§ Например, код для malloc, printf0x89§ Некоторые библиотеки связываются0x03динамически0x5b • Всего 14 байт0xc3§ Связывание происходит при исполнении• Каждая команда1, 2 или 3 байта• Старт по адресу0x040059517Пример машинных команд¢*dest = t;Cи-код§ Сохранить значение t в памятьобозначенную dest¢movq %rax, (%rbx)Ассемблер§ Переместить 8-байтное значение в памятьЧетверное слово в терминах x86-64§ Операнды:t:регистр %raxdest: регистр %rbx*dest: память M[%rbx]§¢0x40059e:48 89 03Объектный код§ 3-байтная команда§ по адресу 0x40059e18Дизассемблирование объектного кодаДизассемлированный код0000000000400595400595: 53400596: 48 89400599: e8 f240059e: 48 894005a1: 5b4005a2: c3¢<sumstore>:pushd3movff ff ffcallq03movpopretq%rbx%rdx,%rbx400590 <plus>%rax,(%rbx)%rbxДизассемблерobjdump –d sum§§§§Полезный инструмент для анализа объектного кодаАнализирует битовые последовательности наборов командПриблизительно воссоздаёт ассемблерный кодМожет обрабатывать файлы a.out (загрузочные) или .o19Вариант дизассемблированияОбъектный код0x0400595:0x530x480x890xd30xe80xf20xff0xff0xff0x480x890x030x5b0xc3Дизассемблированный кодDump of assembler code for function sumstore:0x0000000000400595 <+0>: push%rbx0x0000000000400596 <+1>: mov%rdx,%rbx0x0000000000400599 <+4>: callq 0x400590 <plus>0x000000000040059e <+9>: mov%rax,(%rbx)0x00000000004005a1 <+12>:pop%rbx0x00000000004005a2 <+13>:retq¢С помощью отладчика gdbgdb sumdisassemble sumstore§ Дизассемблируемая процедураx/14xb sum§ Разобрать 14 байт, начиная с sumstore20Что удастся дизассемблировать?% objdump -d WINWORD.EXEWINWORD.EXE:file format pei-i386No symbols in "WINWORD.EXE".Disassembly of section .text:30001000 <.text>:30001000: 55push%ebpразработканарушает30001001: 8b Обратнаяecmov%esp,%ebp30001003: 6a ffлицензионноеpush соглашение$0xffffffff30001005: 68 90 10 00 30 push$0x300010903000100a: 68 91 dc 4c 30 Microsoftpush$0x304cdc91Всё, что имеет смысл исполняемых команд¢ Дизассемблер разбирает указанные байты как машинныйкод и представляет как ассемблерный код¢21Машинный уровень 1: ОсновыКраткая история изделий Интел¢ Си, ассемблер, машинный код¢ Основы ассемблера: регистры, операнды, пересылки¢ Арифметические и логические операции¢22Целочисленные регистры x86-64%rax%eax%r8%r8d%rbx%ebx%r9%r9d%rcx%ecx%r10%r10d%rdx%edx%r11%r11d%rsi%esi%r12%r12d%rdi%edi%r13%r13d%rsp%esp%r14%r14d%rbp%ebp%r15%r15d§ Расширены существующие регистры.
Добавлены 8 новых.§ %ebp/%rbp сделан регистром общего назначения, в отличие от IA3223Общего назначенияПочти история: регистры IA32Мнемоника(устаревшая)%eax%ax%ah%alAccumulateаккумулятор%ecx%cx%ch%clCounterсчётчик%edx%dx%dh%dlDataданные%ebx%bx%bh%blBaseБаза%esi%siSource indexИндекс источника%edi%diDestination indexиндекс назначения%esp%sp%ebp%bpStack pointerуказатель стекаBase pointerуказатель базы16-битные поименованные части регистров(для обратной совместимости)24Пересылки данных¢Перенос данныхmovq Источник, Результат:¢Типы операндов§ Непосредственные: константные%rax%rcx%rdx%rbx%rsiПример: $0x400, $-533%rdi§ Как Cи константы, но с префиксом $%rsp§ Кодируются 1, 2, 4 или 8 байтами%rbp§ Регистровые: только 16 целочисленных§ Пример: %rax, %r13%rN§ %rsp зарезервирован§ Другие особо используются некоторыми командами§ В памяти: 8 последовательных байт памяти по адресу из регистра§ Простейший пример: (%rax)§§Несколько различных вариантов адресации25movq Комбинации операндовОткудаImmmovqКудаRegSrc,Destmovq $0x4,%raxCи-аналогtemp = 0x4;Mem movq $-147,(%rax)*p = -147;RegReg movq %rax,%rdxMem movq %rax,(%rdx)temp2 = temp1;MemRegtemp = *p;movq (%rax),%rdx*p = temp;Нельзя передать из памяти в память одной командой26Простые адресации памяти¢Базовая(R)Mem[Reg[R]]§ Регистр R содержит адрес памяти§ Ага! Раскрытие указателя в Сиmovq (%rcx),%rax¢Cо смещением D(R)Mem[Reg[R]+D]§ Регистр R содержит адрес начала фрагмента памяти§ Константа D обозначает сдвиг от начала фрагментаmovq 8(%rbp),%rdx27Пример использования простых адресацийvoid swap(long *xp, long *yp){long t0 = *xp;long t1 = *yp;*xp = t1;*yp = t0;}swap:movqmovqmovqmovqret(%rdi), %rax(%rsi), %rdx%rdx, (%rdi)%rax, (%rsi)28Разбираем swap()Памятьvoid swap(long *xp, long *yp){long t0 = *xp;long t1 = *yp;*xp = t1;*yp = t0;}Регистр%rdi%rsi%rax%rdxЗначениеxpypt0t1swap:movqmovqmovqmovqretРегистры%rdi%rsi%rax%rdx(%rdi), %rax(%rsi), %rdx%rdx, (%rdi)%rax, (%rsi)####t0 = *xpt1 = *yp*xp = t1*yp = t029Разбираем swap()ПамятьРегистры%rdi0x120%rsi0x100Адреса1230x1180x110%rax0x108%rdxswap:movqmovqmovqmovqret0x120456(%rdi), %rax(%rsi), %rdx%rdx, (%rdi)%rax, (%rsi)####0x100t0 = *xpt1 = *yp*xp = t1*yp = t030Разбираем swap()ПамятьРегистры%rdi0x120%rsi0x100%rax123Адреса1230x1180x1100x108%rdxswap:movqmovqmovqmovqret0x120456(%rdi), %rax(%rsi), %rdx%rdx, (%rdi)%rax, (%rsi)####0x100t0 = *xpt1 = *yp*xp = t1*yp = t031Разбираем swap()ПамятьРегистры%rdi0x120%rsi0x100%rax123%rdx456swap:movqmovqmovqmovqretАдреса1230x1200x1180x1100x108456(%rdi), %rax(%rsi), %rdx%rdx, (%rdi)%rax, (%rsi)####0x100t0 = *xpt1 = *yp*xp = t1*yp = t032Разбираем swap()ПамятьРегистры%rdi0x120%rsi0x100%rax123%rdx456swap:movqmovqmovqmovqretАдреса4560x1200x1180x1100x108456(%rdi), %rax(%rsi), %rdx%rdx, (%rdi)%rax, (%rsi)####0x100t0 = *xpt1 = *yp*xp = t1*yp = t033Разбираем swap()ПамятьРегистры%rdi0x120%rsi0x100%rax123%rdx456swap:movqmovqmovqmovqretАдреса4560x1200x1180x1100x108123(%rdi), %rax(%rsi), %rdx%rdx, (%rdi)%rax, (%rsi)####0x100t0 = *xpt1 = *yp*xp = t1*yp = t034Простые адресации памяти¢Базовая(R)Mem[Reg[R]]§ Регистр R содержит адрес памяти§ Ага! Раскрытие указателя в Сиmovq (%rcx),%rax¢Cо смещением D(R)Mem[Reg[R]+D]§ Регистр R содержит адрес начала фрагмента памяти§ Константа D обозначает сдвиг от начала фрагментаmovq 8(%rbp),%rdx35Полная адресация¢Наиболее общая формаD(Rb,Ri,S)Mem[Reg[Rb]+S*Reg[Ri]+ D]§§§§¢D:Rb:Ri:S:1-, 2-, or 4-байтное константное смещениеБазовый регистр: любой из 8 целочисленных регистровИндексный регистр: любой, кроме %rspМасштаб: 1, 2, 4, или 8 (а почему эти числа?)Специальные случаи(Rb,Ri)D(Rb,Ri)(Rb,Ri,S)Mem[Reg[Rb]+Reg[Ri]]Mem[Reg[Rb]+Reg[Ri]+D]Mem[Reg[Rb]+S*Reg[Ri]]36Пример вычисления адресов%rdx0xf000%rcx0x0100ВыражениеВычисление адресаАдрес0x8(%rdx)0xf000 + 0x80xf008(%rdx,%rcx)0xf000 + 0x1000xf100(%rdx,%rcx,4)0xf000 + 4*0x1000xf4000x80(,%rdx,2)2*0xf000 + 0x800x1e08037Машинный уровень 1: ОсновыКраткая история изделий Интел¢ Си, ассемблер, машинный код¢ Основы ассемблера: регистры, операнды, пересылки¢ Арифметические и логические операции¢38Команда вычисления адреса¢leaq Src,Dest§ Src адресное выражение§ Присваивает Dest адрес вычисленный по выражению¢Используется§ Для вычисления адресов без обращения к памяти§например, трансляции p = &x[i];§ Для вычисления выражений вида x + k*y,§¢где k = 1, 2, 4, или 8Примерlong mul12(long x){return x*12;}Результат компиляции в ассемблер:leaq (%rax,%rax,2), %raxsalq $2, %rax;t <- x+x*2;return t<<239Некоторые арифметические команды¢Двухоперандные команды:ФорматaddqsubqmulqimulqsalqsarqshrqxorqandqorqSrc,DestSrc,DestSrc,DestSrc,DestSrc,DestSrc,DestSrc,DestSrc,DestSrc,DestSrc,DestВычисленияDest = Dest + SrcDest = Dest - SrcDest = Dest * SrcDest = Dest * SrcDest = Dest << Src Синоним: shlqDest = Dest >> Src АрифметическийDest = Dest >> Src ЛогическийDest = Dest ^ SrcDest = Dest & SrcDest = Dest | SrcСледите за порядком аргументов!¢ Почти не различаются signed и unsigned int (почему?)¢40Некоторые арифметические команды¢Однооперандные командыincqdecqnegqnotq¢DestDestDestDestDest = Dest + 1Dest = Dest - 1Dest = - DestDest = ~DestБольше информации – в книге41Carnegie MellonПример арифметических выраженийlong arith(long x, long y, long z){long t1 = x+y;long t2 = z+t1;long t3 = x+4;long t4 = y * 48;long t5 = t3 + t4;long rval = t2 * t5;return rval;}arith:leaqaddqleaqsalqleaqimulqret(%rdi,%rsi), %rax%rdx, %rax(%rsi,%rsi,2), %rdx$4, %rdx4(%rdi,%rdx), %rcx%rcx, %raxИнтересные команды§ leaq: вычисление адресов§ salq: сдвиг§ imulq: умножение§используется лишь однажды42Carnegie MellonРазбираем arithlong arith(long x, long y, long z){long t1 = x+y;long t2 = z+t1;long t3 = x+4;long t4 = y * 48;long t5 = t3 + t4;long rval = t2 * t5;return rval;}arith:leaqaddqleaqsalqleaqimulqret(%rdi,%rsi), %rax%rdx, %rax(%rsi,%rsi,2), %rdx$4, %rdx4(%rdi,%rdx), %rcx%rcx, %rax# t1# t2# t4# t5# rvalРегистрИспользование%rdiArgument x%rsiArgument y%rdxArgument z%raxt1, t2, rval%rdxt4%rcxt543Машинный уровень 1: Основы.
Сводка¢Эволюция процессоров и архитектур Intel§ Эволюционное конструирование приводит к странностям инеестественным свойствам¢Си, ассемблер, машинный код§ Новые формы видимого состояния: счётчик команд, регистры, ...§ Компилятор должен преобразовать операторы, выражения,процедуры в последовательности низкоуровневых команд¢Основы ассемблера: регистры, операнды, пересылки§ Команда move x86-64 обеспечивает множество вариантов пересылки¢Арифметика§ Си компилятор compiler будет выдавать различные комбинациикоманд для реализации одинаковых вычислений44.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.