Необходимо проверить значение flag и eax, в случае flag==1 && eax==0 обнулить flag и сделать прыжок на метку. Задача оптимизировать по скорости и размеру, использовать только один jcc Возможные принимаемые значения Код (Text): flag | eax (DWORD)| -------------- 1 | != 0 -------------- 1 | 0 -------------- 0 | != 0 -------------- 0 | 0 ЗЫ: честно говоря я уже запарился мудрить всяческие neg, sbb и т.д. %)
У тебя есть flag и eax. Каждый принимает по два значения. А сколько ты ДЕЙСТВИЙ выполняешь, после их проверки? Скажем, если eax != 0 и flag = 1, то идти налево, иначе, если flag = 0, то идти направо. Так вот, сколько у тебя таких "иди на ..." в программе?
volodya Если я тебя правильно понял, то ответ содержится в условии задачи, если "flag==1 && eax==0 обнулить flag и сделать прыжок на метку", т.е. идти налево, во всех остальных случаях идти прямо ни в коем случае не изменяя flag
Вот мой первый вариант: Код (Text): neg eax sbb eax,eax inc eax and eax,flag jnz @F обнулять флаг в этом случае придётся после прыжка на метку.
А такой вариант: Код (Text): dec flag ;=0 только при flag = 1 or eax,flag ;=0 только если eax=0 и flag был =1 jz label inc flag ...
leo Вроде работает но длиннее моего на 1 байт Код (Text): 00401000 >/$ FF0D 00304000 DEC DWORD PTR DS:[403000] 00401006 |. 0B05 00304000 OR EAX,DWORD PTR DS:[403000] 0040100C |. 74 06 JE SHORT 00401014 00401014 |> F7D8 NEG EAX 00401016 |. 1BC0 SBB EAX,EAX 00401018 |. 40 INC EAX 00401019 |. 2305 00304000 AND EAX,DWORD PTR DS:[403000] 0040101F |. 75 02 JNZ SHORT 00401023
Тю, возьми код leo и сделай так: Код (Text): mov ebx, flag dec ebx ;=0 только при flag = 1 or eax,ebx ;=0 только если eax=0 и flag был =1 jz label
Asterix тогда почему Код (Text): xor eax,1 ; 1 будет только если eax=0 xor eax,flag ; 0 будет только если flag=1 и eax был 0 jz label а вообще лучше так: Код (Text): sub eax,flag jc label