В программе потребовалось загрузить косвенный адрес, если он задан.
Например,
or EBX, EBX ; задан адрес ?
jnz M ; не задан
mov EBX,[EBX] ; достаем косвенный адрес
M:….
Хотел сократить переход и написал
or EBX, EBX
cmovnz EBX,[EBX]
Но оказалось, что так нельзя, потому что все равно вычисляется адресная часть команды cmov и при нулевом EBX происходит обращение к нулевому адресу, чего, собственно говоря, пытались избежать.
На мой взгляд халтура. Нужно было блокировать исключение, если условие не выполняется. Т.е. cmov не должна давать исключение, если условие не срабатывает. И в документации Intel об этом ни слова.
Здравствуйте, Аноним, Вы писали:
А>В программе потребовалось загрузить косвенный адрес, если он задан.
А>Например,
А>or EBX, EBX ; задан адрес ?
А>jnz M ; не задан
А>mov EBX,[EBX] ; достаем косвенный адрес
А>M:….
А>Хотел сократить переход и написал
А>or EBX, EBX
А>cmovnz EBX,[EBX]
А>Но оказалось, что так нельзя, потому что все равно вычисляется адресная часть команды cmov и при нулевом EBX происходит обращение к нулевому адресу, чего, собственно говоря, пытались избежать.
А>На мой взгляд халтура. Нужно было блокировать исключение, если условие не выполняется. Т.е. cmov не должна давать исключение, если условие не срабатывает. И в документации Intel об этом ни слова.
чукча не читатель ? Берем
доки и читаем на стр. Vol 2A 3-119:
temp ← SRC
IF condition TRUE
THEN
DEST ← temp;
FI;
ELSE
IF (OperandSize = 32 and IA-32e mode active)
THEN
DEST[63:32] ← 0;
FI;
т.е. сначала читаем данные из src, затем проверяем условие — все работает как написано