ДСв19_05-машинный-уровень-2-Управление (1238939), страница 2
Текст из файла (страница 2)
. .}return w;}Пролог:switch_eg:movqcmpqjajmp%rdx, %rcx$6, %rdi# x:6.L8*.L4(,%rdi,8)Какой диапазон значенийопределён местом default?РегистрыИспользование%rdiаргумент x%rsiаргумент y%rdxаргумент z%raxрезультатw инициализированне здесь !33Пример оператора переходаlong switch_eg(long x, long y, long z){long w = 1;switch(x) {. . .}return w;}Пролог:switch_eg:movqcmpqjajmpТаблица переходов.section.rodata.align 8.L4:.quad.L8 # x.quad.L3 # x.quad.L5 # x.quad.L9 # x.quad.L8 # x.quad.L7 # x.quad.L7 # x%rdx, %rcx$6, %rdi# x:6.L8# переход к default*.L4(,%rdi,8) # goto *JTab[x]Косвенный переход=======012345634Пояснения к ассемблерному прологу¢Структура таблицы§ Каждый переход требует 8 байт§ Базовый адрес (начало) .L4¢Переход§ Прямой: jmp .L8§ Цель перехода обозначена меткой .L8§§§§Таблица переходов.section.rodata.align 8.L4:.quad.L8 # x.quad.L3 # x.quad.L5 # x.quad.L9 # x.quad.L8 # x.quad.L7 # x.quad.L7 # x=======0123456Косвенный: jmp *.L4(,%rdi,8)Начало таблицы переходов: .L4Масштабный множитель 8 (адреса - 8 байт)Адрес перехода – в ячейке по эффективному адресу .L4 + x*8§ Только для 0 ≤ x ≤ 635Таблица переходов.section.rodata.align 8.L4:.quad.L8 # x.quad.L3 # x.quad.L5 # x.quad.L9 # x.quad.L8 # x.quad.L7 # x.quad.L7 # x=======0123456switch(x) {case 1:// .L3w = y*z;break;case 2:// .L4w = y/z;/* Переход к другому */case 3:// .L5w += z;break;case 5:case 6:// .L6w -= z;break;default:// .L2w = 2;}36Блоки кода (x == 1)switch(x) {case 1:// .L3w = y*z;break;.
. ..L3:movqimulqret%rsi, %rax%rdx, %rax# y# y*z}РегистрыИспользование%rdiаргумент x%rsiаргумент y%rdxаргумент z%raxрезультат37Рализация перехода к другомуlong w = 1;. . .switch(x) {. . .case 2:w = y/z;/* Переход к другому */case 3:w += z;break;. . .}case 2:w = y/z;goto merge;case 3:w = 1;merge:w += z;38Carnegie MellonБлоки кода (x == 2, x == 3)long w = 1;. . .switch(x) {. .
.case 2:w = y/z;/*Переход к другому*/case 3:w += z;break;. . .}.L5:movqcqtoidivqjmp.L9:movl.L6:addqret# Case 2%rsi, %rax%rcx.L6# y/z# goto merge# Case 3$1, %eax# w = 1# merge:%rcx, %rax # w += zРегистрыИспользование%rdiаргумент x%rsiаргумент y%rdxаргумент z%raxрезультат39Carnegie MellonБлоки кода (x == 5, x == 6, default)switch(x) {. . .case 5: // .L7case 6: // .L7w -= z;break;default: // .L8w = 2;.L7:movlsubqret.L8:movlret# Case 5,6$1, %eax# w = 1%rdx, %rax # w -= z$2, %eax# Default:# 2}РегистрыИспользование%rdiаргумент x%rsiаргумент y%rdxаргумент z%raxрезультат40Промежуточный итог¢Управление в Cи§§§§¢Управление в ассемблере§§§§¢if-then-elsedo-whilewhile, forswitchУсловный переходУсловная пересылкаКосвенный переход (по таблице переходов)Компилятор создаёт код для более сложного управленияСтандартные приёмы§ Циклы преобразуются в форму do-while или переход-в-середину§ Большие switch используют таблицы переходов§ Разреженные switch могут использовать решающие деревья41.