С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
1

Логическое значение у переменной

08.09.2023, 17:14. Показов 869. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Иногда нужно чтобы определённая переменная имела только логическое значение
ноль или единица так называемое булево значение
например при отработки какого нибудь алгоритма
каждый раз у переменной менялось бы логическое значение

это конечно можно сделать обычным условным ветвлением

Assembler
1
2
3
4
5
if dDword == 0
mov dDword,1
else
mov dDword,0
endif
этот способ условным ветвлением всегда даст нужный результат
но поменять логическое значение можно и более быстрым способом

Assembler
1
xor dDword,1
но это будет работать только если у переменной ноль или единица
по сути это конечно то что нам и нужно
но если по какой то случайности в переменной будет другое значение
этот способ не даст ожидаемого результата

есть ли другой способ по мимо условного ветвления
делать так чтобы если в переменной ноль
в ней появлялось бы например любое не нулевое значение
и соответственно если в переменной любое не нулевое значение
в ней появлялся бы ноль

например если для подобной логики использовать однобайтовую переменную
то в данном случае есть сто процентный способ
который тоже выполнится чуть быстрее чем условное ветвление

Assembler
1
2
cmp dByte,0
setz dByte
но это работает только с однобайтовыми значениями

для подобных логических переменных по сути и нужно использовать однобайтный тип
по тому что для нуля или единицы четыре байта многовато будет

но просто ради интереса
есть ли другой способ по мимо условного ветвления у четырёх байтовых переменных

кто в теме подскажите пожалуйста
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2023, 17:14
Ответы с готовыми решениями:

Логическое значение переменной
Доброго времени суток. Помогите, пожалуйста, по такому вопросу: Можно ли при помощи функции...

Присвоить переменной логическое значение в соответствии с правилом
Если заданное число а четное, то true для имени р, а false, если нечетное создание программы,...

Присвоить логической переменной t значение true, если выполняется логическое условие
Добрый вечер. В паскале я разбираюсь пока не очень. Вот решил задачу, но сомневаюсь насчет...

Логическое выражение из переменной в блоке If .. Then
Подскажите, плиз, как мне передать логическое выражения для оператора If из переменной. Т.е я...

9
1606 / 1508 / 251
Регистрация: 19.02.2010
Сообщений: 4,071
08.09.2023, 18:16 2
Цитата Сообщение от assch1 Посмотреть сообщение
есть ли другой способ по мимо условного ветвления у четырёх байтовых переменных
У четырёхбайтовых переменных, например, есть вариант с bswap
Помещаешь в регистр значение 1000000h или 1h, в зависимости от того, какое начальное значение младшего байта (0 или 1) будет нужно. Булева переменная лежит/проверяется в младшем байте регистра, а в старшем байте лежит её второе возможное состояние. После команды bswap значения этих байтов меняются местами.

Цитата Сообщение от assch1 Посмотреть сообщение
есть ли другой способ по мимо условного ветвления у четырёх байтовых переменных
А что, отменили условное ветвление после проверки значения 1байтовой переменной?
Есть CMP r/m8, imm8, CMP r/m8, r8, CMP r8, r/m8 - т.к. дофига возможных вариантов/комбинаций с размещением переменной (регистр, память) и значения для сравнения (непосредственное значение, регистр, память).
0
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
08.09.2023, 18:51  [ТС] 3
вариант с - bswap
при котором надо делать проверку младшего и старшего байта
я уж не говорю о том что значение переменной
нужно сначало поместить в регистр а потом соответственно и обратно
по сути не имеет смысл по тому что банальное условное ветвление
которое под капотом использует - cmp
по скорости сделает это гораздо быстрее
0
1606 / 1508 / 251
Регистрация: 19.02.2010
Сообщений: 4,071
08.09.2023, 21:06 4
Цитата Сообщение от assch1 Посмотреть сообщение
по сути не имеет смысл по тому что банальное условное ветвление
которое под капотом использует - cmp
по скорости сделает это гораздо быстрее
Или крестик сними - или трусы надень
Вопрос был задан про другие варианты, а не про сравнение скоростей:
Цитата Сообщение от assch1 Посмотреть сообщение
но просто ради интереса
есть ли другой способ по мимо условного ветвления у четырёх байтовых переменных
bswap здесь позволяет держать в 4 байтах (вернее, в двух, с двумя неиспользуемыми промежуточными) ВСЮ НУЖНУЮ СЕМАНТИКУ данных (а именно - наше предположение/решение/ограничение о том, что булева переменная в данном случае будет иметь всего 2 значения, без возможности интерпретации любого ненулевого значения как true).

Цитата Сообщение от assch1 Посмотреть сообщение
я уж не говорю о том что значение переменной
нужно сначало поместить в регистр а потом соответственно и обратно
32разрядный код уже давно мало кому интересен, а в 64разрядном режиме добавлено 8 РОНов.
Младшие байты (для того, чтобы для условных проверок байтовую булеву переменную брать оттуда) у этих новых РОНов тоже доступны - r8l,...,r15l.
Т.е. в современных условиях будет существовать ДОСТАТОЧНО программ (вариант - кусков кода), в которых нужная переменная будет ВСЕГДА лежать в регистре, без необходимости её загрузки/выгрузки в память.
0
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
09.09.2023, 04:52  [ТС] 5
VTsaregorodtsev, спасибо за участие в теме
в принципи я хотел сделать макрос например - logic
с одним параметром что то типа

Assembler
1
logic dDword
где под капотом и прописывался бы нужный код
и желательно чтобы не портились регистры
0
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
09.09.2023, 14:42  [ТС] 6
на дружественном форуме предложили варианты
по этому думаю что если для логического значения будет использоваться переменная
1-байтовая или 2-байтовая или 4-байтовая

Assembler
1
logic переменная
под капотом макроса буду прописывать

Assembler
1
2
3
cmp переменная,0
mov переменная,0
setz byte ptr [переменная]
если для логического значения будет использоваться регистр
8-разрядный или 16-разрядный или 32-разрядный

Assembler
1
logic регистр
под капотом макроса буду прописывать

Assembler
1
2
3
cmp регистр,1
mov регистр,0
adc регистр,0
Век живи век учись
0
-12 / 5 / 0
Регистрация: 04.03.2023
Сообщений: 38
11.09.2023, 21:13 7
Assembler
1
2
3
4
5
6
7
xor [dDword],1
test [dDword], 1
jnz @notZero
@Zero:
...
@notZero:
...
0
Модератор
Эксперт по электронике
8542 / 4394 / 1651
Регистрация: 01.02.2015
Сообщений: 13,653
Записей в блоге: 9
11.09.2023, 21:20 8
Да, можно и так, до тех пор, пока не прочитаешь о конвейере команд и его очистке после выполнения инструкции перехода. А к этому, ещё и о "нерезиновом" кэше и последствиях отсутствия в нём копии памяти, на которую осуществляется переход.
0
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
11.09.2023, 23:56  [ТС] 9
_Strange_, как альтернатива да но это по сути тоже самое что и

Assembler
1
2
3
4
5
if dDword == 0
mov dDword,1
else
mov dDword,0
endif
только без операции - xor [dDword],1

спасибо за участие
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
09.11.2023, 10:17 10
Цитата Сообщение от assch1 Посмотреть сообщение
есть ли другой способ по мимо условного ветвления
делать так чтобы если в переменной ноль
в ней появлялось бы например любое не нулевое значение
и соответственно если в переменной любое не нулевое значение
в ней появлялся бы ноль
Assembler
1
2
3
    cmp dDword, 1
    sbb eax, eax
    mov dDword, eax
0
09.11.2023, 10:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2023, 10:17
Помогаю со студенческими работами здесь

Надо вывести название переменной, тип данных переменной, значение переменной
у нас есть переменная int variable = 0; Надо вывести название переменной, тип данных переменной,...

Надо вывести название переменной, тип данных переменной, значение переменной
у нас есть переменная int variable = 0; Надо вывести название переменной, тип данных переменной,...

Логической переменной R присвоить логическое выражение, реализующее указанное условие
помогите пожалуйста решить задачу. логической переменной R присвоить логическое...

Получить адрес переменной, вывести его, сменить значение переменной через указатель, вывести значение
Как вывести адрес переменной?

Присвоить значение наименьшего элемента массива переменной М1, номер строки, где находится этот элемент, - переменной Т, номер столбца - переменной С
Массив С действительных чисел имеет 5 строк и 11 столбцов. Присвоить значение наименьшего элемента...

логическое значение высказывания
какое будет подлогарифмическое выражение y={log}_{2}(x^2-4x+5) найти логические значения


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru