Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

Gooddy (статус: 3-ий класс), 28 июня 2011, 14:30 [#1]:

"Ну это понятно. А как теперь перевести $40 в нормальное представление булевого числа? Т.е. false = 0, true = -1?"

Перепутал малость. Наоборот.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 28 июня 2011, 14:31 [#2]:

Есть вариант
NOT EAX
OR EAX, 40h
А по-другому никак?
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 28 июня 2011, 14:35 [#3]:

Этот вариант не работает.
Для true (40) он вернёт 0, а для false вернёт maxint - 40
Чисти код! Чисти код! Чисти код!
Gooddy

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

bugmenot (статус: 3-ий класс), 29 июня 2011, 10:17 [#5]:

Цитата (bugmenot):

А как теперь перевести $40 в нормальное представление булевого
А зачем это делать? Результат и так соответствует типу из семейства xxxBool
виконання програми розпочинається з того самого мiсця, де призупинилося.

Gooddy

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 приводить?
Чисти код! Чисти код! Чисти код!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:34
Выполнено за 0.03 сек.