Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2011, 23:06   #1
TRIZER
Студент
Пользователь
 
Аватар для TRIZER
 
Регистрация: 13.11.2009
Сообщений: 65
По умолчанию Решение логическоего выражения

Здравствуйте, у меня нубский вопрос.
Дано:
x1,x2,x3,x4,x5,x6,x7,x8 - это биты одного байта.
нужно написать программу на ассемблере для решения логического выражения:

Код:
y = (x1 v x3 v x7) & (x2 v x4 v x6 v x7) & (x5 v x6 v x7 v x8)
Есть идея, которая мне не нравится.
при помощи shr раскидать биты на 8 байт, потом работать с этими байтами.
Но вот код получится очень очень длинный.

Моя идея проста и не оригинальна, и я думаю есть более практичные решения этой задачи . Если кто знает подскажите алгоритм, или хотя бы подкиньте идею (возможно выражение как нибудь упрощается).
TRIZER вне форума Ответить с цитированием
Старый 17.05.2011, 00:40   #2
TRIZER
Студент
Пользователь
 
Аватар для TRIZER
 
Регистрация: 13.11.2009
Сообщений: 65
По умолчанию

Появилась идея
Выражение будет равно 1 если:
x7 = 1
(x1 or x2) and x6 = 1
(x1 or x2) and (x2 or x4) and (5x or x8) = 1
TRIZER вне форума Ответить с цитированием
Старый 17.05.2011, 04:52   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

TRIZER
Идея неверная, если х7 = 1, тогда все выражение равно 1, так как X + 1 = 1 при любых значениях Х
(x1 + x3 + 1)(x2 + x4 + x6 + 1)(x5 + x6 + 1 + x8) = 1 & 1 & 1 = 1
но ведь х7 может быть равен и нулю...
Нужно идти другим путем. В алгебре логики есть закон дистрибутивности (А+В)(А+С)=А+ВС
для твоего примера (А+В)(А+С)(A+D)=(А+ВС)(A+D)=A+BCD
группируем и переставляем элементы
((x1 + x3) + x7)((x2 + x4 + x6) + x7)((x5 + x6 + x8) + x7) =
(x1 + x3)((x2 + x4) + x6)((x5 + x8) + x6) + x7 =
снова используем закон дистрибутивности
(x1 + x3)((x2 + x4)(x5 + x8) + x6) + x7
за счет этого немного упрощаем выражение. Теперь при помощи SHR и AND X,1 делаешь из битов 8 байт и работаешь с этими байтами

Последний раз редактировалось Mikl___; 17.05.2011 в 08:23.
Mikl___ вне форума Ответить с цитированием
Старый 17.05.2011, 08:55   #4
TRIZER
Студент
Пользователь
 
Аватар для TRIZER
 
Регистрация: 13.11.2009
Сообщений: 65
По умолчанию

имел в виду
x7 = 1
либо
(x1 or x2) and x6 = 1
либо
(x1 or x2) and (x2 or x4) and (5x or x8) = 1

если одно из этих условий выполняется выражение гарантированно обращается в 1
TRIZER вне форума Ответить с цитированием
Старый 17.05.2011, 08:59   #5
TRIZER
Студент
Пользователь
 
Аватар для TRIZER
 
Регистрация: 13.11.2009
Сообщений: 65
По умолчанию

в общем я так понял короткого кода не получится?
TRIZER вне форума Ответить с цитированием
Старый 17.05.2011, 09:44   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> x1,x2,x3,x4,x5,x6,x7,x8 - это биты одного байта

если эти биты уже хранятся в одном байте (регистре), скажем AL, то задача элементарная:

Код:
TEST AL, 01000101b  // маска на (x1 v x3 v x7)
JZ exit        // выходим, если 0
TEST AL, 01101010b  // маска на (x2 v x4 v x6 v x7)
JZ exit        // выходим, если 0
TEST AL, 11110000b  // маска на (x5 v x6 v x7 v x8)
JZ exit        // выходим, если 0
// cюда попадаем, если выражение истинно
можно и без переходов, в принципе, пару дополнительных регистров заюзать и вместо TEST делать AND.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 17.05.2011 в 10:18. Причина: не проснулся
veniside вне форума Ответить с цитированием
Старый 17.05.2011, 11:14   #7
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

TRIZER
если объединить мою идею и решение veniside то все достаточно просто
TEST AL,01000000b; x7 = 0 ?
jnz y_equ_1
TEST AL,00000101b; x3 or x1 = 0 ?
jz y_equ_0
TEST AL,00100000b; x6 = 0 ?
jnz y_equ_1
TEST AL,00001010b; x4 or x2 = 0 ?
jz y_equ_0
TEST AL,10110000b; x8 or x5 = 0 ?
jz y_equ_0
y_equ_1: mov y,1
jmp exit
y_equ_0: mov y,0
exit:

Последний раз редактировалось Mikl___; 17.05.2011 в 11:37.
Mikl___ вне форума Ответить с цитированием
Старый 17.05.2011, 12:22   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

в общем случае, если проверок много, лучше код с переходами, чтобы не проверять лишнего. При этом в начале ставим проверки, вероятность срабатывания которых выше.

А если провеорк мало, как в нашем примере, возможно, лучше вобще без переходов:

Код:
   sub    BL, BL
   inc    BL  // BL = 1
   test   AL, 01000101b  // (x1 v x3 v x7)
   setnz  BH
   and    BL, BH
   test   AL, 01101010b  // (x2 v x4 v x6 v x7)
   setnz  BH
   and    BL, BH
   test   AL, 11110000b  // (x5 v x6 v x7 v x8)
   setnz  BH
   and    BL, BH
на выходе BL == 1 (true) или 0 (false)
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярные выражения NewMan123 Помощь студентам 8 04.11.2020 20:23
Регулярные выражения DoGFoX Общие вопросы Delphi 1 03.02.2011 10:49
Регулярное выражения в JS vedro-compota JavaScript, Ajax 3 15.12.2010 19:11
регулярные выражения wyvern PHP 3 09.04.2009 22:15
решение выражения на паскале bonys91 Помощь студентам 2 02.04.2009 22:18