Другие языки программирования и технологии

Объясните пожалуйста, как в ассемблере записывается ветвление (условие if)?

В примере сравниваются два значения, с целью нахождения минимального из них. Не смотря на наличие комментариев к коду, синтаксис мне не удалось понять.
Азат Темиров
Азат Темиров
8 324
Я ассемблер для компьютера плохо знаю, но могу сказать, что ветвление организуются с помощью проверки регистра флагов. Флаги устанавливаются почти после каждой операции и эти флаги отражают результат операции или какие-то другие данные, вот от них и нужно отталкиваться. Когда компьютер сравнивает два числа, он на самом деле отнимает одно от другого: если в результате вычитания получился ноль, значит они равны, при этом флаг нуля будет взведён в единицу. Если одно больше второго то, возможен перенос и будет установлен флаг переноса. Есть специальные команды которые осуществляют переход если какой-то флаг сброшен или установлен. Но это не точно, потому что я программировал на ассемблере для микроконтроллеров, а на компьютере принцип не сильно должен отличаться
Нурлан Кожабергенов
Нурлан Кожабергенов
26 399
Лучший ответ
Александр Боровиков Всё верно, но флаги устанавливают только арифметические команды (и может ещё некоторые). Команда сравнения - это по сути тоже арифметическая команда - это вычитание без сохранения результата.
Операторы JXX -- это и есть условные переходы. Условие определяется регистром флагов, который установился после предыдущего оператора.
Чтоб понять синтаксис, надо прочитать в документации, что делает каждая команда. Интуитивно понять тут не получится.
При сравнении числе в Ассемблере надо учитывать разницу между числами со знаком и без знака. В обеих случаях используется команда CMP, но разные команды условного перехода Jxx.
Ветвление производится как бы в два приема:
1. Сравниваются два числа (cmp al, ah)
2. Если выполняется "условие сравнения" перейти на метку (jl less)
причем само "условие сравнения" записывается после "j"
т. е. jl меньше, jle меньше или равно и т. п.
U Плут
7 579
все объяснил да ?
Инструкция JLE проверяет флаги SF, OF и ZF. Переход выполняется, если

SF не равен OF
или ZF = 1
Сама же инструкция JLE при работе никакие флаги не изменяет.

зайти в гугл и найти это было не тяжело для тебя же будет легче если будешь находить инфо с гугла тоже