Безумовні переходи
Головною інструкцією переходу у наборі інструкцій процесора 8086 є інструкція JMP. Ця інструкція вказує процесору 8086, що у якості наступної за JMP інструкцією потрібно виконати інструкцію цільової мітки. Наприклад, після завершення виконання фрагменту програми:
mov ax,1 jmp AddTwoToAX AddOneToAX inc ax jmp AxslSet AddTwoToAX: inc ax AxlsSet: регістр AX,буде містити значення 3, а інструкція ADD та JMP, слідуючи за міткою AddOneToAX, ніколи виконані не будуть. Тут інструкція:
AddTwoToAX
вказує процесору 8086, що треба встановити покажчик інструкцій IP у значення зміщення мітки AddTwoToAx, тому наступною виконуємою інструкцією буде інструкція:
add ax,2
Іноді спільно з інструкцією JMP використовується операція SHORT. Для вказівки не цільові мітку інструкція JMP звичайно використовує 16-бітове зміщення. Операція SHORT вказує Турбо Асемблеру, що треба використовувати не 16-бітове, а 8-бітове зміщення (що дозволяє зекономити в інструкції JMP один байт). Наприклад, останній фрагмент програми можна переписати так, що він стане на два байта коротшим:
mov ax,1 jmp SHORT AddTwoToAX AddOneToAX: inc ax jmp SHORT AxsSet AddTwoToAX: inc ax AxsSet:
Недолік використання операції SHORT (короткий) полягає у тому, що короткі переходи можуть здійснювати передачу керування на мітки, які на віддалі від інструкції JMP не далі, ніж на 128 байтів, тому у деяких випадках Турбо Асемблер може повідомляти вам, що мітка недосяжна за допомогою короткого переходу. До також операцію SHORT має сенс використовувати для посилок вперед, тому що для переходів назад (на попередні мітки) Турбо Асемблер автоматично використовує короткі переходи, якщо на мітку можна перейти за допомогою короткого переходу, та довгі у протилежному випадку. Інструкцію JMP можна також використовувати для переходу в інший сегмент коду, завантажуючи в одній інструкції і регістр CS, і регістр IP. Наприклад, у програмі:
Cseg1 SEGMENT ASSUME CS:Cseg1 FarTarget LABEL FAR Cseg1 ENDS Cseg2 SEGMENT ASSUME CS:Cseg2 jmp FarTarget Cseg2 ENDS
виконується перехід дальнього типу. Якщо ви бажаєте, щоб мітка, примусово інтерпретувалася, як мітка дальнього тупу, можна використовувати операцію FAR PTR. Наприклад, у фрагменту програми:
jmp FAR PTR NearLabel nop NearLabel:
виконується перехід дальнього типу на мітку NearLabel, хоча ця мітка знаходиться у тім же сегменті коду, що й інструкція JMP. Нарешті, ви можете виконати перехід по адресі, записаній у регістрі чи в змінній пам’яті. Наприклад:
mov ax,OFFSET TestLabel jmp ax . . TestLabel:
Тут виконується перехід на мітку TestLabel, так як і у наступному фрагменту:
JumpTarget DW TaestLabel
jmp [JumpTarget] . . TestLabel:
|