Халтура в команде CMOV
От: Аноним  
Дата: 26.06.14 06:00
Оценка:
В программе потребовалось загрузить косвенный адрес, если он задан.
Например,
or EBX, EBX ; задан адрес ?
jnz M ; не задан
mov EBX,[EBX] ; достаем косвенный адрес
M:….

Хотел сократить переход и написал
or EBX, EBX
cmovnz EBX,[EBX]

Но оказалось, что так нельзя, потому что все равно вычисляется адресная часть команды cmov и при нулевом EBX происходит обращение к нулевому адресу, чего, собственно говоря, пытались избежать.
На мой взгляд халтура. Нужно было блокировать исключение, если условие не выполняется. Т.е. cmov не должна давать исключение, если условие не срабатывает. И в документации Intel об этом ни слова.
Re: Халтура в команде CMOV
От: Сергей Мухин Россия  
Дата: 26.06.14 06:58
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А> И в документации Intel об этом ни слова.


ну уж!

Вот что написано у интел для cmov:

Operation
temp ← SRC
IF condition TRUE
THEN
DEST ← temp;
FI;
ELSE
IF (OperandSize = 32 and IA-32e mode active)
THEN
DEST[63:32] ← 0;
FI;
---
С уважением,
Сергей Мухин
Re: Халтура в команде CMOV
От: mike_rs Россия  
Дата: 26.06.14 07:10
Оценка:
Здравствуйте, Аноним, Вы писали:


А>В программе потребовалось загрузить косвенный адрес, если он задан.

А>Например,
А>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, затем проверяем условие — все работает как написано
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.