|
Вопрос # 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 приводить?
Чисти код! Чисти код! Чисти код!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|