Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.07.06;
Скачать: CL | DM;

Вниз

Ассемблерщикам: 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.html
Jump 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.011 c
2-1372177061
Вова
2013-06-25 20:17
2014.07.06
Оптимизация кода


2-1378443004
shura
2013-09-06 08:50
2014.07.06
Перевести char


3-1299090765
John_Vattic
2011-03-02 21:32
2014.07.06
Access 2007 и Delphi 7


15-1387570707
Несусвет
2013-12-21 00:18
2014.07.06
Как сохранить блог?


2-1378437422
Den
2013-09-06 07:17
2014.07.06
Вызвать webbrowser.onDocumentComplete из timer?