Форум: "Прочее";
Текущий архив: 2014.07.06;
Скачать: [xml.tar.bz2];
ВнизАссемблерщикам: CF/ZF Найти похожие ветки
← →
DevilDevil © (2013-12-20 11:22) [0]Не могу понять, почему опкод jnc и jae одинаковый
Работаю над неким подобием компилятора ассемблера и застрял на оптимизации/реализации прыжков.
Смотрим пример:je @1
..
@1: jae @2
..
@2:
В данном случае логично прооптимизировать je @1 к je @2, что логично
Но если я заменю команды на эквивалентные (с такими же опкодами), то логика теряется.jz @1
..
@1: jnc @2
..
@2:
И я не могу понять зависимости по флагам ZF и CF. Объясните.
← →
jumping jack (2013-12-20 11:58) [1]cmp - это беззнаковое вычитание без сохранения результата
если из бОльшего числа вычитать меньшее - всё ок, флаги сброшены
если числа равны - 0 (Zero on)
если из меньшего вычитать большее и результат без знака - это переполнение, Carry flag On
← →
jumping jack (2013-12-20 12:04) [2]то есть ZF и CF одновременно установлены не будут в любом случае
ZF=1 означает, что CF=0
← →
Оксана Опанасовна (2013-12-20 12:06) [3]Приведи реальный код.
http://stackoverflow.com/questions/14267081/difference-between-jz-je-and-jne-jnz
← →
jumping jack (2013-12-20 12:08) [4]НО это не касается сложения, смещения и др. операций
← →
DevilDevil © (2013-12-20 12:16) [5]> jumping jack (20.12.13 12:08) [4]
> НО это не касается сложения, смещения и др. операций
в смысле ?
← →
Оксана Опанасовна (2013-12-20 12:18) [6]
> DevilDevil © (20.12.13 11:22)
> Не могу понять, почему опкод jnc и jae одинаковый
А с чего им быть разными ?
http://ref.x86asm.net/coder32.htmlJump short if not below/above or equal/not carry (CF=0)
Т.е. по сути это разные названия (для удобства) для одной и той же операции проверки CF.
← →
jumping jack (2013-12-20 12:28) [7]> в смысле ?
в смысле, это только после CMP, SUB или SBB верно: ZF=1 означает, что CF=0
т. е. "В данном случае прооптимизировать" нельзя без оглядки на предыдущую (не приведенную тобой) инструкцию
← →
DevilDevil © (2013-12-20 12:47) [8]Раскрываю карты.
Объявлен тип прыжка. Упрощено говоря... jmp и все варианты jcc
Каким образом я определяю, что X --> Y --> Z можно оптимизировать до X --> Z
С точки зрения теории множеств... когда условия X являются подмножеством условий Y (X <= Y)
Я создаю табличку флагов по каждому варианту прыжка. Условно говоря массив множеств по каждому варианту
Тогда X является подмножеством Y если flags[X] and flags[Y] = flags[X]
К примеру jl (ZF=1) является подмножеством jle (ZF=1 или SF<>OF)
Но я не могу сообразить насчёт "и-логики" в условиях. Как раз сложность приходится на вышеописанные прыжки
jae (CF=0)
ja (CF=0 & ZF=0)
je (ZF = 1)
ja <= jae
je <= jae
И я не могу понять, как уложить сию логику в операции над флагами (множествами)
← →
jumping jack (2013-12-20 12:49) [9]DevilDevil, ты не рано в такие сложности заныриваешь?
ну, разве что поупражняться если хочется (особенно в написании тестов)
если что-то реально полезное собрался делать - лучше присмотрись к LLVM и её языку/байт-коду
ей можно скармливать неоптимизированный байт-код, а уж она потрудится над оптимальным машинным
и есть удобное API для этого "скармливания" (с ним проще, чем сам код генерировать)
т.е. это уже готовые 2/3 компилятора с любого языка
← →
DevilDevil © (2013-12-20 12:58) [10]> LLVM
Там "компилятор" высокого уровня. А мне нужен "компилятор" ассемблера
Другие условия. Я надеюсь в 2014 году увидите зачем он мне нужен )))
← →
DevilDevil © (2013-12-20 13:02) [11]Я начинаю думать, что придётся реализовывать так
Подтвердите или опровергните
1) CF=0 & ZF=0
2) CF=0 & ZF=1
CF=0 --> 1 || 2
3) CF=1 & ZF=0
4) CF=1 & ZF=1
CF=1 --> 3 || 4
ZF=0 --> 1 || 3
ZF=1 --> 2 || 4
← →
jumping jack (2013-12-20 13:12) [12]мнемоника "jnc" выражает строгое, буквальное значение этой инструкции: "СF=0 и никак иначе!"
"jae" (больше или равно) выражает частное (зависящее от контекста) её значение
в контексте с предшествующим "cmp" это значение справедливо (имеет смысл), в других контекстах (add, shr) - нет:
add ax, 100
jae @1 ; что больше чего мы тут хотим проверить?? 100 больше AX??? бред!
может, ты зря контекст выкидываешь-то? чем ширше контекст, тем глубже выйдет (/войдет) оптимизация! может, все-таки предыдущую инструкцию тоже рассматривать?
и на всякий случай: "ZF=1" не является подмножеством "CF=0" ни в коем разе!!!!!
← →
jumping jack (2013-12-20 13:24) [13]>> LLVM
> Там "компилятор" высокого уровня
нету ТАМ никаких компиляторов это средний уровень с бэк-ендами для конкретных процессоров, компиляторы - фронт-енды к нему (к LLVM)
можешь писать себе на "голом ассемблере", но не x86, а LLVM
попробуй - может понравиться
(хотя бы проверь производительность выходящего кода)
← →
Оксана Опанасовна (2013-12-20 13:57) [14]
> jumping jack (20.12.13 13:24) [13]
> можешь писать себе на "голом ассемблере", но не x86, а LLVM
А есть хороший сайт с примерами программирования LLVM от ХеллоуАллес до Хауту ?
← →
jumping jack (2013-12-20 14:16) [15]Оксана Опанасовна, для начала и на русском - http://habrahabr.ru/search/?q=llvm
далее по ссылкам
← →
DevilDevil © (2013-12-20 14:44) [16]> add ax, 100
> jae @1 ; что больше чего мы тут хотим проверить?? 100 больше
> AX??? бред!
ты написал:sub ax, -100
jae @1
Т.е. сравнил ax с -100
← →
DevilDevil © (2013-12-20 14:46) [17]Ну или в беззнаковой арифметике:
sub ax, 65436
jae @1
← →
jumping jack (2013-12-20 14:59) [18]<потерял дар речи>
← →
DevilDevil © (2013-12-20 15:00) [19]> jumping jack (20.12.13 14:59) [18]
не согласен ?
← →
jumping jack (2013-12-20 15:24) [20]ыыыыы ааааа мммммммм ууууууууу
← →
jumping jack (2013-12-20 15:28) [21]о, сколько нам открытий чудных
готовит просвещенья дух
и опыт, сын ошибок трудных
и кто-то, может быть, еще
← →
DevilDevil © (2013-12-20 15:32) [22]Стихи могу не приводить цитатой
А в риалтайме наваять.
И ты был прав на счёт команды -
Нельзя add sub-ом заменять
← →
DevilDevil © (2013-12-20 15:46) [23]Я решил пока не учитывать предыдущую команду
И сделать оптимизации, которые должны работать корректно при любом раскладе
Например jle --> jz ==> jle
← →
DevilDevil © (2013-12-20 15:47) [24]т.е. наоборот блин
jz --> jle ==> jz
← →
DevilDevil © (2013-12-20 16:36) [25]Вощем у меня получились такие гарантированные оптимизации
Поправьте, если какая-то неверна или какой-то не хватает
Элементарные типа jcc --> jmp ==> jcc или je --> jz ==> je я решил не приводитьjb --> jbe ==> jb
jb --> jna ==> jb
jc --> jbe ==> jc
jc --> jna ==> jc
jnae --> jbe ==> jnae
jnae --> jna ==> jnae
je --> jbe ==> je
je --> jna ==> je
je --> jle ==> je
je --> jng ==> je
jz --> jbe ==> jz
jz --> jna ==> jz
jz --> jle ==> jz
jz --> jng ==> jz
ja --> jae ==> ja
ja --> jnb ==> ja
ja --> jnc ==> ja
ja --> jnz ==> ja
ja --> jne ==> ja
jnbe --> jae ==> jnbe
jnbe --> jnb ==> jnbe
jnbe --> jnc ==> jnbe
jnbe --> jnz ==> jnbe
jnbe --> jne ==> jnbe
jl --> jle ==> jl
jl --> jng ==> jl
jnge --> jle ==> jnge
jnge --> jng ==> jnge
jg --> jnz ==> jg
jg --> jne ==> jg
jg --> jge ==> jg
jg --> jnl ==> jg
jnle --> jnz ==> jnle
jnle --> jne ==> jnle
jnle --> jge ==> jnle
jnle --> jnl ==> jnle
← →
DevilDevil © (2013-12-20 16:54) [26]Ща рабочий день закончится. Забегая вперёд расскажу ещё об одной оптимизации - объединение двух прыжков в одну метку
je @1
jl @1
...
@1:
Должно превратиться вjle @1
...
@1:
У меня получился такой список. Пожалуйста если есть что добавить/исправить - говоритеjb + je = jbe
jb + jz = jbe
jb + jbe = jbe
jb + jna = jna
jc + je = jbe
jc + jz = jbe
jc + jbe = jbe
jc + jna = jna
jnae + je = jbe
jnae + jz = jbe
jnae + jbe = jbe
jnae + jna = jna
jae + ja = jae
jae + jnbe = jae
jnb + ja = jnb
jnb + jnbe = jnb
jnc + ja = jnc
jnc + jnbe = jnc
je + jb = jbe
je + jc = jbe
je + jnae = jbe
je + jbe = jbe
je + jna = jna
je + jl = jle
je + jnge = jle
je + jle = jle
je + jng = jng
jz + jb = jbe
jz + jc = jbe
jz + jnae = jbe
jz + jbe = jbe
jz + jna = jna
jz + jl = jle
jz + jnge = jle
jz + jle = jle
jz + jng = jng
jnz + ja = jnz
jnz + jnbe = jnz
jnz + jg = jnz
jnz + jnle = jnz
jne + ja = jne
jne + jnbe = jne
jne + jg = jne
jne + jnle = jne
jbe + jb = jbe
jbe + jc = jbe
jbe + jnae = jbe
jbe + je = jbe
jbe + jz = jbe
jna + jb = jna
jna + jc = jna
jna + jnae = jna
jna + je = jna
jna + jz = jna
ja + jae = jae
ja + jnb = jnb
ja + jnc = jnc
ja + jnz = jnz
ja + jne = jne
jnbe + jae = jae
jnbe + jnb = jnb
jnbe + jnc = jnc
jnbe + jnz = jnz
jnbe + jne = jne
jl + je = jle
jl + jz = jle
jl + jle = jle
jl + jng = jng
jnge + je = jle
jnge + jz = jle
jnge + jle = jle
jnge + jng = jng
jge + jg = jge
jge + jnle = jge
jnl + jg = jnl
jnl + jnle = jnl
jle + je = jle
jle + jz = jle
jle + jl = jle
jle + jnge = jle
jng + je = jng
jng + jz = jng
jng + jl = jng
jng + jnge = jng
jg + jnz = jnz
jg + jne = jne
jg + jge = jge
jg + jnl = jnl
jnle + jnz = jnz
jnle + jne = jne
jnle + jge = jge
jnle + jnl = jnl
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2014.07.06;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.004 c