| 
| 
 | Вопрос # 5 457/ вопрос решён / | 
 |  Доброго времени суток, уважаемые эксперты!
 Как на языке ассемблера i80x86 поместить в переменную значение логического выражения без команд j*?
 
 Предположим x = a | b;
 
 Это ясно дело
 mov x, a
 or x, b
 
 А как быть в таком случае?
 x = a == b
 
 Кроме команды je альтернативы нет?
 Примечание #1 (28 июня 2011, 11:46): Поправочка. Кроме команды jne. Ну и остальных j* тоже, мало ли чего вы мне тут придумаете =) 
 
|  |   Вопрос задал: Gooddy (статус: 3-ий класс)Вопрос отправлен: 28 июня 2011, 11:45
 Состояние вопроса: решён, ответов: 1.
 |  Ответ #1. Отвечает эксперт: bugmenot procedure TForm1.FormCreate(Sender: TObject);
const
  fZero = $0040;
var
  a, b: LongWord;
  x: WordBool;
begin
  a := 42;
  b := 666;
 
  asm
    MOV EAX, a
    MOV EDX, b
    CMP EAX, EDX
    PUSHF
    POP AX
    AND AX, fZero
    MOV x, AX
  end;
 
  Caption := BoolToStr(x, True);
end;
|  | Ответ отправил: bugmenot (статус: 3-ий класс)Время отправки: 28 июня 2011, 14:18
 Оценка за ответ: 5
 Комментарий к оценке: Ну это понятно. А как теперь перевести $40 в нормальное представление булевого числа? Т.е. false = 0, true = -1? |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 29 июня 2011, 15:42; участников в обсуждении: 2. 
|   | Gooddy (статус: 3-ий класс), 28 июня 2011, 14:30 [#1]:"Ну это понятно. А как теперь перевести $40 в нормальное представление булевого числа? Т.е. false = 0, true = -1?" 
 Перепутал малость. Наоборот.
 Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 28 июня 2011, 14:31 [#2]:Есть вариант NOT EAX
OR EAX, 40hА по-другому никак? Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 28 июня 2011, 14:35 [#3]:Этот вариант не работает. Для true (40) он вернёт 0, а для false вернёт maxint - 40
 Чисти код! Чисти код! Чисти код! |  
|   | Gooddy (статус: 3-ий класс), 28 июня 2011, 14:46 [#4]:Надо было сразу посмотреть под отладчиком код Delphi. 
 setnle
 setl
 setnl
 setle
 setz (sete)
 setnz (setne)
 
 Нужно только помнить что они устанавливают -1 для true и 0 для false.
 Чисти код! Чисти код! Чисти код! |  28 июня 2011, 14:50: Статус вопроса изменён на решённый (изменил автор вопроса — Gooddy) 
|   | bugmenot (статус: 3-ий класс), 29 июня 2011, 10:17 [#5]: Цитата (bugmenot): А как теперь перевести $40 в нормальное представление булевогоА зачем это делать? Результат и так соответствует типу из семейства xxxBool виконання програми розпочинається з того самого мiсця, де призупинилося.
 
 |  
|   | Gooddy (статус: 3-ий класс), 29 июня 2011, 15:42 [#6]:-_-. 
 
 True = -1;
False = 0;
T & F = F;
T & T = T;
!T = F;
!F = T; А теперь для True возьмём не -1 а любое другое число.
 
 True = 0001;
False = 0000;
T & F = 0000; //правильно
T & T = 0001; //правильно
!T = 1110;    //НЕправильно
!F = 1111;    //НЕправильно Понятно зачем было в форму 0, -1 приводить?
 Чисти код! Чисти код! Чисти код! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |