Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/2256: Рейтинг темы: голосов - 2256, средняя оценка - 4.63
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16374 / 7686 / 1080
Регистрация: 11.11.2010
Сообщений: 13,761
15.11.2013, 04:52  [ТС]
ГЛАВА 13
ПЕРЕХОДЫ И ЦИКЛЫ
(часть 3/5)

Команды установки байтов
Команда Проверяемые флаги Логическое условие
SETA/SETNBE CF = 0 и ZF = 0 выше
SETAE/SETNB /SETNC CF = 0 выше или равно/нет переноса
SETB/SETNAE /SETC CF = 1 ниже / перенос
SETBE/SETNA CF = 1 или ZF = 1 ниже или равно
SETE/SETZ ZF = 1 равно или ноль
SETG/SETNLE ZF = 0 или SF = OF больше
SETGE/SETNL SF = OF больше или равно
SETL/SETNGE SFhttps://www.cyberforum.ru/cgi-bin/latex.cgi?\neqOF меньше
SETLE/SETNG ZF=1 или SF https://www.cyberforum.ru/cgi-bin/latex.cgi?\neq OF меньше или равно
SETNE/SETNZ ZF = 0 не равно или не ноль
SETNO OF=0 нет переполнения
SETNP/SETPO PF = 0 нет контроля четности
SETNS SF = 0 положительное число
SETO OF = 1 переполнение
SETP/SETPE PF = 1 контроль четности
SETS SF = 1 отрицательное число
Если проверяемое условие (или содержимое соответствующих флагов на момент выдачи команды SETcc) истинно, то установить значение операнда в 1, если условие ложно – то в 0.
Применение: эти команды можно использовать после любой команды, изменяющей флаги при необходимости анализа результата изменений, а использование команд CMP или TEST по каким-то причинам невозможно. В основном используются, чтобы избежать ветвлений. Если проанализировать условия для команд условного перехода, то обнаружится их полное соответствие с условиями, обрабатываемыми командой SETcc, за исключением, конечно, команды JCXZ.
Assembler
1
2
3
4
5
6
7
;подсчитать число единичных битов в регистре AX
MOV CX,16
M1: ROL AX,1
SETC BL
ADD BH,BL
CLC
LOOP M1
Два варианта следующей задачи: если EAX не меньше числа B, тогда EBX=C1 иначе EBX=C2

  1. Assembler
    1
    2
    3
    4
    5
    
     mov ebx,C1
    cmp eax,B
    jge label0
    add ebx,C2-C1
    label0:
  2. Assembler
    1
    2
    3
    4
    5
    6
    
    xor ebx,ebx
    cmp eax,B
    setge bl
    dec ebx
    and ebx,(C1-C2)
    add ebx,C2
if (a<666h) zzz=100h else zzz=300h

  1. Assembler
    1
    2
    3
    4
    5
    6
    7
    
    mov ecx,100h
    mov eax,[var_A]
    cmp eax,666h
    jl l_0
    add ecx,200h
    mov [var_zzz],ecx
    l_0:

  2. Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    mov eax,[var_A]
    xor ecx,ecx;ecx=0
    cmp eax,666h
    ;if eax<666h SF=1 OF=1 else SF=0 OF=0
    setge cl;if eax<666h cl=1 else cl=0
    not ecx;if eax<666h ecx=-1 else ecx=0
    and ecx,100h-300h
    ;ecx=0FFFFFE00h else ecx=0
    add ecx,300h;if eax<666h ecx=100h
    else ecx=300h mov [var_zzz],ecx
установить переменную Bool=1 если A <= B иначе Bool=0
Assembler
1
2
3
mov ax, A ;значения A и B целые со знаком
cmp ax, B
setle Bool
Так как результат выполнения инструкций setcc всегда 0 или 1 эти инструкции можно использовать совместно с логическими операциями AND, OR, XOR, NOT
установить переменную Bool=1 если условие ((A<=B) and (D=E)) or (F<>G) истинно
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
mov ax, A
cmp ax, B
setle bl
mov ax, D
cmp ax, E
sete bh
and bl, bh
mov ax, F
cmp ax, G
setne bh
or bl, bh
mov Bool, bh
Так как выполнение инструкций setcc всегда устанавливает или сбрасывает восьмой бит результата, то, используя операции сдвига и вращения, можно в байт результата упаковать до восьми результатов разных инструкций сравнения:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
cmp Val7, 0
setne al;установить 0-й бит в зависимости от значения Val7
cmp Val6, 0
setne ah
shr ah, 1;передаем значение 0-го бита в Carry Flag
rcl al,1;установить 0-й бит в зависимости от значения Val6
;значение Val7 определяется теперь по 1-му биту
cmp Val5, 0
setne ah
shr ah, 1
rcl al, 1
cmp Val4, 0
setne ah
shr ah, 1
rcl al, 1
cmp Val3, 0
setne ah
shr ah, 1
rcl al, 1
cmp Val2, 0
setne ah
shr ah, 1
rcl al, 1
cmp Val1, 0
setne ah
shr ah, 1
rcl al, 1
cmp Val0, 0
setne ah
shr ah, 1
rcl al, 1
;сейчас в AL все биты установлены в зависимости от значений Val0-Val7.
Если подходить к командам условного перехода с позиции машинной кодировки команд, то четыре старших бита команды (для микропроцессора i8086) содержат код 7, а четыре младших бита команды обозначают условие операции. Условие задается в битах 1-3, а установка бита 0 приводит к его инверсии.
 Код операцииУсловиеИнверсия
биты7 6 5 4 3 2 1 0
Те же самые биты используются и при кодировке команд SETcc и CMOVcc (код операции F9 для команд SETcc и F4 для CMOVcc, кроме того в кодировке команд CMOVcc, как и в коде любой команды MOV, будут присутствовать биты режима, биты адреса регистра приемника и биты адреса регистра источника). Как видите, условий совсем немного, и проблем с их запоминанием обычно не возникает. Теперь уже не нужно мучительно вспоминать jz – это 74h или 75h. Так как младший бит команды равен нулю, то jz – это 74h, а jnz, соответственно, 75h.
Код Мнемоника Условие
01110000 O Переполнение
01110010 B, NAE Меньше
01110100 Z Равно
01110110 BE, NA Меньше или равно
01111000 S Знак
01111010 P, PE Четно
01111100 L, NGE Меньше (знаковое)
01111110 LE, NG Меньше или равно (знаковое)
Код jccМнемо-КодМнемо-КодМнемоника
короткий длинныйника ника  
70h 0F80h JO 0F90h SETO 0F40 cw/cd CMOVO
71h 0F81h JNO 0F91h SETNO 0F41 cw/cd CMOVNO
72h 0F82hJC/JB/JNAE0F92hSETC/SETB/SETNAE0F42 cw/cdCMOVC/CMOVB/CMOVNAE
73h 0F83hJNC/JNB/JAE0F93hSETNC/SETNB/SETAE0F43 cw/cdCMOVNC/CMOVNB/CMOVAE
74h 0F84h JE/JZ 0F94h SETE/SETZ 0F44 cw/cd CMOVE/CMOVZ
75h 0F85h JNE/JNZ 0F95h SETNE/SETNZ 0F45 cw/cd CMOVNE/CMOVNZ
76h 0F86h JBE/JNA 0F96h SETBE/SETNA 0F46 cw/cd CMOVBE/CMOVNA
77h 0F87h JNBE/JA 0F97h SETNBE/SETA 0F47 cw/cd CMOVNBE/CMOVA
78h 0F88h JS 0F98h SETS 0F48 cw/cd CMOVS
79h 0F89h JNS 0F99h SETNS 0F49 cw/cd CMOVNS
7Ah 0F8Ah JP/JPE 0F9Ah SETP/SETPE 0F4A cw/cd CMOVP/CMOVPE
70h 0F80h JO 0F90h SETO 0F40 cw/cd CMOVO
7Bh 0F8Bh JNP/JPO 0F9Bh SETNP/SETPO 0F4B cw/cd CMOVNP/CMOVPO
7Ch 0F8Ch JL/JNGE 0F9Ch SETL/SETNGE 0F4C cw/cd CMOVL/CMOVNGE
7Dh 0F8Dh JNL/JGE 0F9Dh SETNL/SETGE 0F4D cw/cd CMOVNL/CMOVGE
7Eh 0F8Eh JLE/JNG 0F9Eh SETLE/SETNG 0F4E cw/cd CMOVLE/CMOVNG
7Fh 0F8Fh JNLE/JG 0F9Fh SETNLE/SETG 0F4F cw/cd CMOVNLE/CMOVG
Команды CMOVcc
(Условная передача данных = ”Condition MOVE”)
Синтаксис команд:
CMOV<condition code> <DEST>,<SRC>
Возможные варианты команды:
cmovcc reg32,reg32
cmovcc reg32,[reg32]
cmovcc reg32,mem32
Семантика команды
: передача данных из операнда SRC в операнд DEST при выполнении условий, определяемых состоянием соответствующих флагов.
Алгоритм работы: команды проверяют истинность условия, заданного в коде операции, то есть, фактически, состояние определенных флагов, и если условие выполняется (производится передача данных из операнда SRC в операнд DEST), то команда заканчивается без пересылки.
Псевдокод:
temphttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowSRC
IF(64-Bit Mode)
THEN
IF condition TRUE
THEN
IF (OperandSize =64)
THEN
DESThttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowtemp
ELSE
DESThttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowtemp AND 0x0FFFFFFFF
ENDIF
ENDIF
ELSE
IF condition TRUE
THEN
DESThttps://www.cyberforum.ru/cgi-bin/latex.cgi?\leftarrowtemp
ENDIF
ENDIF
Команды условной пересылки данных
Команда Проверяемые флаги Логическое условие
CMOVA/ CMOVNBE CF = 0 и ZF = 0 выше
CMOVAE/ CMOVNB/CMOVNC CF = 0 выше или равно / нет переноса
CMOVB/CMOVNAE/ CMOVC CF = 1 ниже / перенос
CMOVBE/ CMOVNA CF = 1 или ZF = 1 ниже или равно
CMOVE/CMOVZ ZF = 1 равно или ноль
CMOVG/ CMOVNLE ZF = 0 или SF = OF больше
CMOVGE/ CMOVNL SF = OF больше или равно
CMOVL/ CMOVNGE SF?OF меньше
CMOVLE/ CMOVNG ZF=1 или SF ? OF меньше или равно
CMOVNE/ CMOVNZ ZF = 0 не равно или не ноль
CMOVNO OF=0 нет переполнения
CMOVNP/ CMOVPO PF = 0 нет контроля четности
CMOVNS SF = 0 положительное число
CMOVO OF = 1 Переполнение
CMOVP/ CMOVPE PF = 1 контроль четности
CMOVS SF = 1 отрицательное число
Выполнение команды пересылки CMOVcc на состояние флагов не влияет.
Применение: эти команды можно использовать после любой команды, изменяющей флаги, при необходимости анализа результата изменений. Это существенно повышает гибкость программирования на языке ассемблера, одновременно уменьшая объем кода за счет устранения команд сравнения и условного перехода.
;пересылка из регистра EAX в переменную mem32, если флаг ZF=1
cmove eax,mem32
Следующие последовательности эквивалентны:
test ecx,ecx
jne a1
mov eax,ebx
a1:
test ecx,ecx
cmoveq eax,ebx
Команда CMOVEQ выполняет условную пересылку содержимого регистра EBX в EAX. Ветвление устраняется путем замены JNE и MOV на эту команду
Предсказание ветвлений
Обработка команд в современных процессорах осуществляется поэтапно на основе конвейерного принципа. При обнаружении команды условного ветвления может оказаться что операция, определяющая соответствующее условие, еще не выполнена до конца. В этом случае невозможно определить, какая из ветвей программы будет выполняться дальше. До недавнего времени подобные ситуации приводили к тому, что обработка дальнейших команд приостанавливалась до момента вычисления условного перехода. Ввиду того, что длина конвейера может быть весьма велика, это приводило к значительным потерям производительности. Данная проблема может быть решена путем сбора статистической информации о том, исполнение какой ветви условного перехода более вероятно. Данная информация может быть получена, например, во время предыдущих проходов данного участка или кода из «подсказки», вставленном компилятором в исполнимый код. В этом случае процессор может продолжить обработку команд предсказанной ветви программы. В тот момент, когда становится доступным значение условного выражения, проверяется правильность предсказания. Если оно окажется неверным, результаты обработки ошибочно выбранных команд уничтожаются, и начинается обработка альтернативной ветви программы.
Это приводит к простою исполнительных блоков процессора. Таким образом, наихудшим вариантом является условный переход, обе ветви которого равновероятны.
Для всех рассматриваемых процессов приближение вероятности условного перехода к 0,5 приводит к двукратному снижению производительности. Это означает, что каждый неверно предсказанный переход приводит к увеличению времени выполнения соответствующих инструкций примерно в 4 раза.
В связи с этим целесообразно удалять операции условного перехода из часто выполняемых участков программы. Например, если переход выполняется для четных элементов некоторого массива, целесообразно создать два цикла, отдельно обрабатывающих четные и нечетные элементы.
0
Закрытая тема Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru