Поиск:

Ответ в темуСоздание новой темы Создание опроса
> операции сравнения (==, !=, <, >, <=, >=, &&, ||) 
:(
    Опции темы
scuter
Дата 20.10.2011, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 13.6.2008

Репутация: 1
Всего: 1




как сделать обычное сравнение(==) это ещё понятно,
Код

cmp al, dx;
jz metka;

а как сделать остальные

к примеру

if(x<y){...}
if(x>y){...}
if(x!=y){...}

множественные условия

if(x==y&&b<a){...}
if((a==b&&x>=y)||b!=x){...}
PM MAIL   Вверх
JAPH
Дата 20.10.2011, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 5
Всего: 23



Код
if (x != y) { ... }

делается почти так же, как и проверка на равенство:
Код
    cmp  al, y
    je   @F
    ...
@@:

Прыжок произойдет тогда, когда x == y, соответственно, "..." выполнится только в случае неравенства.

Чтобы сравнивать на меньше-больше, необходимо определиться с тем, знаковые у нас типы или нет. Если сравнение знаковое, то на помощь придут команды jl, jle (jng), jg, jnl (jge). Если беззнаковое, то ja, jb (jc), jnb (jnc, jae), jbe (jna).
Например, 
Код
int x, y;
// ..
if (x > y) { ... }
Код
    cmp al, y
    jle @F
    ...
@@:


Чтобы написать множественные сравнения, надо просто следить за тем, куда и при каких условиях прыгаем. Если if без else, то прыжок должен происходить при невыполнении условия if. Например, 
Код
if (x == y && x < z) { ... }
 при беззнаковых x и z делается так:
Код
    cmp al, y
    jne @F ; если не подошло первое условие, то второе не проверяем
    cmp al, z
    jnb @F
    ...
@@:



--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
scuter
Дата 21.10.2011, 03:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 13.6.2008

Репутация: 1
Всего: 1



Цитата(JAPH @  20.10.2011,  23:01 Найти цитируемый пост)
Чтобы написать множественные сравнения, надо просто следить за тем, куда и при каких условиях прыгаем. Если if без else, то прыжок должен происходить при невыполнении условия if. Например, код C++1:if (x == y && x < z) { ... }highlightSyntax('cpp_2E1NWI','cpp'); при беззнаковых x и z делается так:код Ассемблера1:2:3:4:5:6:    cmp al, y    jne @F ; если не подошло первое условие, то второе не проверяем    cmp al, z    jnb @F    ...@@:

когда используется оператор (&&)
должно выполняться и то и другое условие т.е.
должно выполняться что то типа этого
if (x == y && x < z) { ... }
Код

    mov al, x
    cmp al, y
    and
    cmp al, z
    jnb @F

но я не знаю сработает ли это и проверить этот код тоже не могу
PM MAIL   Вверх
JAPH
Дата 21.10.2011, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 5
Всего: 23



Проблема в том, что в ассемблере and это &, а не &&. Здесь нет группирования операций, нельзя "взять в скобки" mov+cmp и как-то объединить результат с чем-то еще. Каждая команда выполняется отдельно от других и тут же забывается, процессор идет вперед, не оглядываясь. Остаются от команд только измененные значения в регистрах, памяти и флагах. Именно из-за того, что cmp меняет флаги, а условные переходы их проверяют, может казаться, что cmp+je это что-то цельное. Вполне между ними можно поставить mov или что-то еще, флаги не меняющее.

Логика сложных условий с && и || делается за счет переходов.
Когда выполняются оба условия в том примере с &&, ни один условный переход не срабатывает и выполняется тело ifа. Если хотя бы одно условие неподходящее, то срабатывает соответствующий переход и if не выполняется.

Это сообщение отредактировал(а) JAPH - 21.10.2011, 12:19


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
Google
  Дата 23.9.2017, 06:36 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.1243 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.