Главная /
Ассемблер /
Для чайников /
Условный и безусловный переход
|
Лучшие книги по Ассемблеру
Сделал подборку не новых, но проверенных книг по программированию на языке ассемблера. Если вы также как и я любите погружаться на низкий уровень, в те закоулки мира программирования, куда не всем путь открыт, то посмотрите. Возможно, что-то вам понравится.
Подробнее...
|
В любой более-менее сложной программе есть много участков кода, которые выполняются (или не выполняются) в зависимости от каких-то условий.
Например, мы выполняем деление одного числа на другое. Что может быть проще? Но не спешите - а вдруг второе число окажется нулём? А на ноль, как известно, делить нельзя. Поэтому перед делением надо проверить, является ли число нулём. Если да, то отказаться от деления, а если нет, то выполнить деление.
Поэтому в любом языке программирования есть способы проверки каких-то условий и перехода на указанный участок кода в зависимости от результата проверки условия.
Условный переход - это передача управления по другому адресу или на указанную метку, если выполняется определённое условие.
Безусловный переход - это передача управления по другому адресу или на указанную метку, независимо от того, выполняется какое-либо условие или нет.
Безусловный переход в ассемблере можно выполнить с помощью команды JMP. Пример:
.model tiny
.code
ORG 100h
JMP begin
MOV AX, 0FFFFh ;Это не будет выполнено
begin:
MOV BX, 1
RET
END begin
Здесь в самом начале программы вы выполняем безусловный переход на метку begin
,
и таким образом участок кода MOV AX, 0FFFFh
не будет выполнен.
Когда нужен безусловный переход? По разному бывает. Ну, например, у вас есть какой-то код,
который используется только при отладке программы. Когда программа готова, то этот код уже не нужен.
Но убирать его не хочется - вдруг ещё придётся выполнять отладку. В этом случае вы перед этим кодом
ставите инструкцию JMP
и перепрыгиваете через него на указанную метку. Кстати,
JMP - это сокращение от JuMP, что переводится как “прыгать”.
Команды для выполнения безусловного перехода есть и в языках высокого уровня. Вот рабочий пример на Паскале:
program jmp;
label World;
begin
goto World;
Write('Hello'); //Это не будет выполнено
World:
Write(', World');
WriteLn('!!!');
ReadLn;
end.
Здесь мы выполняем безусловный переход на метку World
, поэтому код
Write('Hello');
не будет выполнен.
Но, надо сказать, что использование безусловного перехода в языках высокого уровня считается дурным тоном - так уже никто не пишет, потому что это делает исходные коды запутанными и малопонятными.
В ассемблере же это нормально, потому что он всё равно уже запутан )))
Ну а теперь к условному переходу. Вспомним наш пример с делением. В том же Паскале это будет выглядеть так:
x := 100;
y := 0;
z := x / y; //!!! Ошибка
Чтобы избежать ошибки во время выполнения программы, надо перед делением проверить y на равенство нулю:
if y <> 0 then z := x / y;
И тогда ошибки не произойдёт, потому что код z := x / y
не будет выполнен, а будет выполнен условный переход на следующий участок кода программы.
В ассемблере такие вещи, конечно, выполнить сложнее - потребуется написать больше букв. Сначала ошибочный код:
MOV AX, 250 ; Делимое в регистр AX
MOV BL, 0 ; Делитель в регистр BL
DIV BL ; Здесь будет ошибка, если BL = 0
Здесь мы пытаемся разделить число 250 на ноль. Это приведёт к ошибке во время выполнения программы. Более правильный код должен быть таким:
.model tiny
.code
ORG 100h
begin:
MOV AX, 250 ; Делимое в регистр AX
MOV BL, 0 ; Делитель в регистр BL
CMP BL, 0 ; Сравнить BL с 0
JZ zero ; Если BL = 0, то перейти на zero
DIV BL ; Выполняем деление
zero:
RET
END begin
Команда JZ выполняет переход на указанную метку, если флаг ZF
равен 1. А он будет установлен в 1 после выполнения команды СМР,
если значение в регистре BL равно 0. В этом случае мы перескакиваем на метку zero
,
не выполняя код DIV BL
. И таким образом избегаем ошибки во время выполнения.
|
Первые шаги в программирование
Главный вопрос начинающего программиста – с чего начать? Вроде бы есть желание, но иногда «не знаешь, как начать думать, чтобы до такого додуматься».
У человека, который никогда не имел дело с информационными технологиями, даже простые вопросы могут вызвать большие трудности и отнять много времени на решение.
Подробнее...
|