Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.004 c
15-1386273085
Rouse_
2013-12-05 23:51
2014.07.06
о вреде курения


15-1387016736
картман
2013-12-14 14:25
2014.07.06
батарейка


2-1378365351
lewka-mar
2013-09-05 11:15
2014.07.06
Подстановка значений в edit


15-1387312202
Юрий
2013-12-18 00:30
2014.07.06
С днем рождения ! 18 декабря 2013 среда


15-1387524120
DevilDevil
2013-12-20 11:22
2014.07.06
Ассемблерщикам: CF/ZF





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский