ДС18в05-машинный-уровень-2-Управление (1238908)
Текст из файла
Carnegie MellonМашинный уровень 2: УправлениеОсновы информатикиКомпьютерные основы программированияgoo.gl/X7evFНа основе CMU 15-213/18-243:Introduction to Computer Systemsgoo.gl/Q7vgWwЛекция 5, 05 марта, 2018Лектор:Дмитрий Северов, кафедра информатики 608 КПМdseverov@mail.mipt.rucs.mipt.ru/wp/?page_id=3461Машинный уровень 2: УправлениеУправление: флаги условий¢ Условные переходы и пересылки¢ Циклы¢ Операторы переключения¢ Процедуры IA 32¢§ Структура стека§ Соглашения вызова процедур§ Рекурсия и указатели2Carnegie MellonСостояние процессора (x86-64, частично)¢Информация онепосредственноисполняемой программеРегистры%rax%r8§ Промежуточные данные%rbx%r9%rcx%r10%rdx%r11%rsi%r12%rdi%r13%rsp%r14%rbp%r15( %rax, … )§ Адрес вершины стека( %rsp )§ Адрес текущей команды( %rip, … )§ Результаты последнихпроверок ( CF, ZF, SF, OF )Указатель команды%ripТекущая вершина стекаCFZFSFOFФлаги условий3Флаги условий (неявная установка)¢Однобитные регистры- флаги§CF§ZF¢перенос (для unsigned)нольSF знак (для signed)OF переполнение (для signed)Устанавливаются арифметическими операцияминеявно (как побочный результат)Пример: addq Src,Dest ↔ t = a+bCF=1, если перенос в старший бит или заём из него (беззнаковоепереполнение)ZF=1, если t == 0SF=1, если t < 0 (как знаковое), SF == MSBOF=1, если переполнился дополнительный код (знаковый)(a>0 && b>0 && t<0) || (a<0 && b<0 && t>=0)¢Не устанавливаются командой lea!4Флаги условий(явная установка сравнением)¢Явная установка командами сравнения§cmpq Src2, Src1§cmpq b,a как вычисление a-b без сохранения результата§CF=1, если перенос из старшего бита или заём в него(используется при беззнаковых сравнениях)§ZF=1, если a == b§SF=1, если (a-b) < 0 (как знаковые )§OF=1, переполнение в дополнительном коде (знаковое)(a>0 && b<0 && (a-b)<0) || (a<0 && b>0 && (a-b)>0)5Флаги условий(явная установка проверкой бит)¢Явная установка командой test§testq Src2, Src1§testqb,a как вычисление a&b без сохранения результата§Устанавливает флаги в зависимости от Src1 & Src2§Удобно, если один из операндов - маска§ZF=1, если a&b == 0§SF=1, если a&b < 0 (старший бит == 1)6Чтение флагов условий IA32 - 1¢Команды set*§ Устанавливают один байт в 1 или 0 в зависимости от флагов§ Не изменяют остальные 7 байтКомандаsetesetnesetssetnssetgsetgesetlsetlesetasetbУсловиеZF~ZFSF~SF~(SF^OF)&~ZF~(SF^OF)(SF^OF)(SF^OF)|ZF~CF&~ZFCFОписаниеРавно / НольНеравно / Не нольОтрицательноНеотрицательноБольше (знаковое)Больше или равно (знаковое)Меньше (знаковое)Меньше или равно (знаковое)Выше (беззнаковое)Ниже (unsigned)7x86-64 Целочисленные регистры%rax%al%r8%r8b%rbx%bl%r9%r9b%rcx%cl%r10%r10b%rdx%dl%r11%r11b%rsi%sil%r12%r12b%rdi%dil%r13%r13b%rsp%spl%r14%r14b%rbp%bpl%r15%r15b§ Можно обращаться к младшим байтам8Чтение флагов условий - 2¢Команды set*§ Устанавливают один байт в 1 или 0 в зависимостиот флагов¢Один из 8 байтовых регистров§ Не изменяются остальные байты регистра§ Зануление остатка обычно – movzbl§32-битные команды зануляют старшие 32 битаint gt (long x, long y){return x > y;}cmpq%rsi, %rdisetg%almovzbl %al, %eaxretРегистрПрименение%rdiаргумент x%rsiаргумент y%raxрезультат# Сравнение x:y# Установка младшего байта %rax в 1 если ># Зануление остальных байт %rax9Машинный уровень 2: УправлениеУправление: флаги условий¢ Условные переходы и пересылки¢ Циклы¢ Операторы переключения¢ Процедуры IA 32¢§ Структура стека§ Соглашения вызова процедур§ Рекурсия и указатели10Переходы¢Команды j*§ Передача управления по адресу в зависимости от флаговj*jmpУсловия1ОписаниеjeZFРавно / Нольjne~ZFНеравно / Не нольjsSFОтрицательноjns~SFНеотрицательноjgjge~(SF^OF)&~ZF Больше (знаковое)~(SF^OF)Больше или равно (знаковое)jl(SF^OF)Меньше (знаковое)jle(SF^OF)|ZFМеньше или равно (знаковое)ja~CF&~ZFВыше (беззнаковое)jbCFНиже (беззнаковое)Безусловный11Carnegie MellonПример условного ветвления (по старинке)¢Создание> gcc –Og -S –fno-if-conversion control.clong absdiff(long x, long y){long result;if (x > y)result = x-y;elseresult = y-x;return result;}absdiff:cmpqjlemovqsubqret.L4:movqsubqret%rsi, %rdi.L4%rdi, %rax%rsi, %rax# x:y# x <= y%rsi, %rax%rdi, %raxРегистрПрименение%rdiаргумент x%rsiаргумент y%raxрезультат12Carnegie MellonПредставление «go to» кодомСи допускает оператор goto¢ Переход в точку, обозначенную меткой¢long absdiff(long x, long y){long result;if (x > y)result = x-y;elseresult = y-x;return result;}long absdiff_j(long x, long y){long result;int ntest = x <= y;if (ntest) goto Else;result = x-y;goto Done;Else:result = y-x;Done:return result;}13Трансляция условного выражения в общем(используя ветвление)Cи кодval = Test ? Then_Expr : Else_Expr;val = x>y ? x-y : y-x;§ Test – целочисленное выражениеgoto версияnt = !Test;if (nt) goto Else;val = Then_Expr;goto Done;Else:val = Else_Expr;Done:.
. .= 0 интерпретируется как ложь§ ≠ 0 интерпретируется как истина§ Создаёт раздельные фрагменты кодадля Then_Expr и Else_Expr§ Исполняется только один из двух§14Использование условной пересылки¢Команды условной пересылки§ Команды поддерживают:if (Test) Dest ß Src§ Есть в x86 процессорах после 1995г.§ GCC пытается использовать их§ Но, только в безопасных случаях!¢А зачем?§ Переходы разрушают конвейерноеисполнение инструкций§ Условная пересылка не вызываетпередачи управленияСи кодval = Test? Then_Expr: Else_Expr;goto версияresult = Then_Expr;eval = Else_Expr;nt = !Test;if (nt) result = eval;return result;15Carnegie MellonПример условной пересылкиlong absdiff(long x, long y){long result;if (x > y)result = x-y;elseresult = y-x;return result;}absdiff:movqsubqmovqsubqcmpqcmovleret%rdi,%rsi,%rsi,%rdi,%rsi,%rdx,%rax%rax%rdx%rdx%rdi%raxРегистрПрименение%rdiаргумент x%rsiаргумент y%raxрезультат# x# result = x-y# eval = y-x# x:y# if <=, result = eval16Неудачные применения усл.
пересылкиРесурсоёмкие вычисленияval = Test(x) ? Hard1(x) : Hard2(x);¢Оба значения вычисляются¢Имеет смысл только для очень простых выраженийРискованые вычисленияval = p ? *p : 0;¢Оба значения вычисляются¢Возможен нежелательный эффектВычисления с побочным эффектомval = x > 0 ? x*=7 : x+=3;¢Оба значения вычисляются¢Побочные эффекты должны исключаться17Машинный уровень 2: УправлениеУправление: флаги условий¢ Условные переходы и пересылки¢ Циклы¢ Операторы переключения¢ Процедуры IA 32¢§ Структура стека§ Соглашения вызова процедур§ Рекурсия и указатели18Пример цикла do-whileCи кодlong pcount_do(unsigned long x) {long result = 0;do {result += x & 0x1;x >>= 1;} while (x);return result;}¢¢goto версияlong pcount_goto(unsigned long x) {long result = 0;loop:result += x & 0x1;x >>= 1;if(x) goto loop;return result;}Подсчитывает количество единичных бит в аргументе x (подсчётвыталкиванием)Использует условный переход для зацикливания или выхода из цикла19Компиляция цикла do-whilegoto версияlong pcount_goto(unsigned long x) {long result = 0;loop:result += x & 0x1;x >>= 1;if(x) goto loop;return result;}РегистрыПрименение%rdiаргумент x%raxрезультатmovl$0, %eax.L2:#movq%rdi, %rdxandl$1, %edxaddq%rdx, %raxshrq%rdijne.L2rep; ret# result = 0loop:####t = x & 0x1result += tx >>= 1if (x) goto loop20Компиляция do-while в общемСи кодdoТелоwhile (Условие);¢Тело: {}goto версияloop:Телоif (Условие)goto loopоператор1;оператор2;…операторn;21Carnegie MellonТрансляция “while” в общем №1Трансляция “переход-в-середину”¢ Используется при -Og“goto” версияgoto test;loop:“while” версияТелоwhile (Условие)test:Телоif (Условие)goto loop;done:¢22Пример цикла while №1Cи кодlong pcount_while(unsigned long x) {long result = 0;while (x) {result += x & 0x1;x >>= 1;}return result;}¢Переход в серединуlong pcount_goto_jtm(unsigned long x) {long result = 0;goto test;loop:result += x & 0x1;x >>= 1;test:if(x) goto loop;return result;}Отличие от do-while§ Начальный goto начинает цикл с проверки23Компиляция while в общем №2while версияwhile (Условие)Телоdo-while версияif (!Условие)goto done;doТелоwhile(Условие);done:сведение к “do-while”¢ Используется при –O1¢goto версияif (!Условие)goto done;loop:Телоif (Условие)goto loop;done:24Carnegie MellonПример цикла while №2Cи кодlong pcount_while(unsigned long x) {long result = 0;while (x) {result += x & 0x1;x >>= 1;}return result;}¢do-while версияlong pcount_goto_dw(unsigned long x) {long result = 0;if (!x) goto done;loop:result += x & 0x1;x >>= 1;if(x) goto loop;done:return result;}Отличие от “do-while”§ Начальное условие защищает вход в цикл25Общая форма цикла forОбщая формаfor(Начало; Условие; Изменение )Началоi = 0УсловиеТело#define WSIZE 8*sizeof(int)long pcount_for(unsigned long x){size_t i;long result = 0;for (i = 0; i < WSIZE; i++){unsigned bit =(x >> i) & 0x1;result += bit;}return result;}i < WSIZEИзменениеi++Тело{unsigned bit =(x >> i) & 0x1;result += bit;}26Цикл for à цикл whilefor версияfor(Начало; Условие; Изменение )Телоwhile версияНачало;while (Условие) {ТелоИзменение;}27Carnegie MellonПреобразование for-whileНачалоi = 0Условиеi < WSIZEИзменениеi++Тело{unsigned bit =(x >> i) & 0x1;result += bit;long pcount_for_while(unsigned long x){size_t i;long result = 0;i = 0;while (i < WSIZE){unsigned bit =(x >> i) & 0x1;result += bit;i++;}return result;}}28Преобразование цикла for - do-whilegoto версияCи кодlong pcount_for(unsigned long x){size_t i;long result = 0;for (i = 0; i < WSIZE; i++){unsigned bit =(x >> i) & 0x1;result += bit;}return result;}¢Начальное условие можетбыть оптимизированоlong pcount_for_goto_dw(unsigned long x) {size_t i;long result = 0;Началоi = 0;if (!(i < WSIZE))goto done;!Условиеloop:{unsigned bit =Тело(x >> i) & 0x1;result += bit;}i++; Изменениеif (i < WSIZE)Условиеgoto loop;done:return result;}29Машинный уровень 2: УправлениеУправление: флаги условий¢ Условные переходы и пересылки¢ Циклы¢ Операторы переключения¢ Процедуры IA 32¢§ Структура стека§ Соглашения вызова процедур§ Рекурсия и указатели30long switch_eg(long x, long y, long z){long w = 1;switch(x) {case 1:w = y*z;break;case 2:w = y/z;/* Переход к другому */case 3:w += z;break;case 5:case 6:w -= z;break;default:w = 2;}return w;}Пример оператораswitch¢Совмещённыеварианты§ case 5 и case 6¢Переход к другомуварианту§ Из case 2 в case 3¢Отсутствующиеварианты§ case 431Структура таблицы переходовТаблица переходовВ виде switchswitch(x) {case val_0:Блок 0case val_1:Блок 1• • •case val_n-1:Блок n–1}jtab:Targ0Цели переходовTarg0:Блок кода0Targ1Targ2•••Targn-1Targ1:Блок кода1Targ2:Блок кода2•••Приблизительный переводgoto *JTab[x];Targn-1:Блок кодаn–132Пример оператора переходаlong switch_eg(long x, long y, long z){long w = 1;switch(x) {.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.