Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер
Регистрация

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 31.03.2011, 14:38   #1
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию Условный переход командой jnb. В чем смысл данного перехода?

Решил написать программу, которая ищет по одномерному массиву максимальный элемент. Самому не получилось, поэтому воспользовался макросами .while и .if. Программа вышла вот такая:
Код:
.386
.model flat, stdcall
option casemap : none
.data
array dd 1,7,4,6,8
max dd 0
.code
start:
xor esi, esi
mov eax, array[esi]
mov max, eax
mov ecx, 5
.while ecx
add esi, 4
mov eax, array[esi]
.if max<eax
mov max, eax
.endif
dec ecx
.endw
ret
end start
Я её засунул в отладчик, и взглянув на дизассемблерский код переписал его и скомпилировал. Программа работала. Кстати вот такая она получилась:

Код:
.386
.model flat, stdcall
option casemap : none
.data
array dd 1,7,4,6,8
max dd 0
.code
start:
xor esi, esi
mov eax, array[esi]
mov max, eax
mov ecx, 5
jmp short @3
@1:
add esi, 4
mov eax, array[esi]
cmp max, eax
jnb short @2
mov max, eax
@2:
dec ecx
@3:
or ecx, ecx
jnz short @1
ret
end start
Решил разобраться в исходнике, но мешает команда jnb. Посмотрел в справочнике, а там написано что она предназначена перехода если выше или равны/не ниже/ нет переноса.
Из моих начальных знаний в ассемблере, помню, что перенос - это когда число переполняется, и в итоге в eax начинается отсчет заново, а флаг O устанавливается в 1. Правильно ли это?
И самая главная проблема - что значит выше или равны/не ниже? Объясните пожалуйста данные вещи. Или скиньте информацию поэтому поводу почитать.
Ibanez Wizard вне форума Ответить с цитированием
Старый 31.03.2011, 14:48   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
cmp max, eax
флаг переноса будет выставлен, если число в max меньше числа в eax (числа рассматриваются как беззнаковые).

Код:
jnb
переход по метке будет произведён, если флаг переноса очищен.


> что значит выше или равны/не ниже?

jnb (Not Below) ещё иногда записывают как jae (Above or Equal) или как jnc (No Carry). Смысл один и тот же:

не ниже (Not Below) = выше или равны (Above or Equal) = нет переноса (No Carry)

Т.е. первый операнд не ниже (не меньше) второго.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 31.03.2011 в 15:08.
veniside вне форума Ответить с цитированием
Старый 31.03.2011, 15:06   #3
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

Оо Venside. Спасибо огромное). Как раз разобрался и зачем здесь or ecx, ecx нужен, и что как работает. Сейчас попробую тоже самое, только с двухмерным массивом переписать.
Ibanez Wizard вне форума Ответить с цитированием
Старый 01.04.2011, 04:41   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,155
По умолчанию

Ibanez Wizard
команды or reg,reg или and reg,reg или test reg,reg используют для сравнения содержимого reg с нулем вместо команды cmp reg,0 -- в байтах короче и иногда быстрее
Mikl___ вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Краткий смысл. В чем цель и смысл вашей жизни? grenles Свободное общение 20 13.09.2010 07:13
условный переход if then else Rin Assembler - Ассемблер 2 05.05.2010 16:06
Условный переход в МК051 GMSD Assembler - Ассемблер 0 18.11.2009 13:16
В чем смысл "Задачи о выборе процессов" Dezolyator Помощь студентам 1 24.05.2009 21:48
В чем смысл жизни? NNN Свободное общение 76 14.07.2008 21:16